Elm端口在Firefox中不工作
我在让Elm端口与Firefox一起工作时遇到问题 这是我的Elm端口在Firefox中不工作,firefox,elm,Firefox,Elm,我在让Elm端口与Firefox一起工作时遇到问题 这是我的index.html: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Firefox Ports</title>
index.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Firefox Ports</title>
</head>
<body>
<script src="/app.js"></script>
</body>
</html>
这是我的Main.elm
:
port module Main exposing (main)
import Html exposing (Html, div, text)
type Msg
= None
type alias Model =
{}
initialModel : Model
initialModel =
{}
init : ( Model, Cmd Msg )
init =
( initialModel, sayHello "Foo" )
port sayHello : String -> Cmd msg
main : Program Never Model Msg
main =
Html.program
{ init = init
, update = update
, subscriptions = subscriptions
, view = view
}
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
( model, Cmd.none )
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
view : Model -> Html Msg
view model =
div []
[ text "Hello" ]
在chrome控制台中,输出显示在初始化模型时调用端口函数(init
):
清楚地显示端口函数已被调用,但在Firefox中,最后一行(问候语,Foo
)缺失:
here
window.onload
我做错了什么?您可以尝试将
subscribe()
调用移动到fullscreen()
const app = Elm.Main.fullscreen();
app.ports.sayHello.subscribe(function(who) {
console.log("Greetings,", who);
});
console.log("here");
window.onload = function() {
console.log("window.onload");
};
我的直觉是Firefox中的事件周期在window.onload
之前运行Elm代码,而当时该端口没有订阅。这只是一种预感,但我认为最佳实践要求您在创建应用程序时立即设置订阅。如果在全屏()调用之后移动subscribe()
调用会发生什么?(在记录“here”
)之前,它可以工作,因此问题不应该出在端口上。实际上,我从一个更大的程序中简化了这一点,该程序试图控制一个使用Google dialog polyfill的模态对话框。我还需要再调查一次。@ChadGilbert它在Firefox中工作,包括对话框polyfill。不确定为什么窗口。onload
出现问题。如果你把你的评论转换成回答,我会接受的。谢谢。我还添加了一个端口,用dialogPolyfill
注册每个对话框,它可以正常工作,但我将尝试将该部分移动到窗口中。onload
函数可以自动注册带有标记dialog
的所有元素。
here
window.onload
const app = Elm.Main.fullscreen();
app.ports.sayHello.subscribe(function(who) {
console.log("Greetings,", who);
});
console.log("here");
window.onload = function() {
console.log("window.onload");
};