Hi All,
I’m in the finishing state of our webapp development and added the --optimize flag to elm make.
This resulted in following error:
Uncaught TypeError: Jr is not a function
I did not have this error before using the optimize flag.
By evaluating the code in Chrome dev tools I found out it is related to Browser.Dom.getElement.
Fyi: we have several rotary like sliders on some of the pages and we need the location of the slider to translate the touch coordinates in slider values.
My code:
getDomLocation : String -> Cmd Msg
getDomLocation taskId =
( Task.attempt
(NewDomLocation taskId)
(Browser.Dom.getElement taskId)
)
getDomLocationVolumeSliders : Model -> ZoneId -> Cmd Msg
getDomLocationVolumeSliders model zoneId =
let
zone : Zone
zone =
case zoneId of
Zone1 -> model.zone1
Zone2 -> model.zone2
in
Cmd.batch
[ getDomLocation zone.micAVolume.rotaryId
, getDomLocation zone.micBVolume.rotaryId
, getDomLocation zone.sourceVolume.rotaryId
]
init : Flags -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
init flags url key =
( { initialModel | layout = updateLayout flags
, webSocket = WebSocket.updateUrl url initialModel.webSocket
}
, Cmd.batch
[ (getDomLocationVolumeSliders initialModel Zone1)
, ( setBodyBackgroundColor
(updateLayout flags).device
initialModel.theme
initialModel.activePanel
)
]
)
If I replace the Cmd.batch in getDomLocationVolumeSliders with Cmd.none the error is gone. The function getDomLocationVolumeSliders is called in several places, but as the error appeared on load, I first checked the init function. I replaced Cmd.none again with the Cmd.batch and commented the getDomLocationVolumeSliders call in the init function. The error was gone.
If I called getDomLocationVolumeSliders from other places it just worked.
I solved the error by not giving initalModel to getDomLocationVolumeSliders but the updated initialModel.
My working code: (with --optimize flag)
init : Flags -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
init flags url key =
let
initialModel : Model
initialModel =
{ emptyModel | layout = updateLayout flags
, webSocket = WebSocket.updateUrl url emptyModel.webSocket
}
in
( initialModel
, Cmd.batch
[ (getDomLocationVolumeSliders initialModel Zone1)
, ( setBodyBackgroundColor
(updateLayout flags).device
initialModel.theme
initialModel.activePanel
)
]
)
I did not change function getDomLocation or function getDomLocationVolumeSliders.
So by giving getDomLocationVolumeSliders the updated intial model the error is solved. While it only takes 3 strings from the model and those strings do not change.
Strange no? Isn’t this a runtime error? I did not have any Elm compile errors.
I solved it for my implementation, so I’m happy
. I just wanted to discuss what I possibly did wrong or maybe it’s something wrong with the optimization steps that are applied with --optimize.
Thanks!
Jasper