2016-06-02 2 views
4

Elm guide과 해당 JavaScript interop을 통해 읽고 있습니다. 여기에 단순화 된 버전이다포트 및 가입 문제가 발생했습니다.

port module FooBar exposing (..) 

import Html exposing (..) 
import Html.Attributes exposing (..) 
import Html.App as Html 
import String 

main = 
    Html.program 
    { init = init 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

-- subscriptions 
port f :() -> Cmd msg 
port g : (Int -> msg) -> Sub msg 

subscriptions: Model -> Sub Msg 
subscriptions model = g Get 

-- MODEL 
type alias Model = { pt : Int } 

-- VIEW 
view: Model -> Html Msg 
view model = Html.text (toString model.pt) 

-- UPDATE 
type Msg = Ask | Get Int 

update: Msg -> Model -> (Model, Cmd msg) 
update msg model = 
    case msg of 
    Ask -> (model, f()) 
    Get x -> (Model x, Cmd.none) 

-- INIT 
init: (Model, Cmd Msg) 
init = (Model 0, f()) 

앱이 초기 0으로 설정되어 있지만, 자바 스크립트에서 메시지를 읽어와 1로 설정 될 수있다. 그러나 그것은 에 남아 있습니다. 느릅 나무 포트가 제대로 설정 되었습니까? 여기

<div id="foobar"></div> 
<script src="foo.js"></script> 
<script> 
    var node = document.getElementById("foobar"); 
    var app = Elm.FooBar.embed(node); 

    app.ports.f.subscribe(
    function(){ 
     var myValue = 1; 
     console.log(myValue); 
     app.ports.g.send(myValue); 
    } 
); 
</script> 

</body> 

내가 넣어 : elm-make foo.elm --output=foo.js

1f() 포트라고있어 제안하지만, g() 포트가 다시 전송하거나 처리 없구요으로 myValue 인쇄 콘솔로 사실 정확히.

답변

3

Html.App이 임의의 포트에 가입되기 전에 init이 호출되기가 어렵습니다.

따라서 f()init에서 호출해도 아무런 효과가 없습니다.

나는 더미 작업을 실행하고 항상 보내는 포트를 트리거하는 Ask 메시지를 보내는 send 함수를 사용합니다. 당신은 단지 당신의 느릅 나무 애플리케이션에 자바 스크립트에서 기본값을 보낼 찾고 있다면

-- INIT 


init : (Model, Cmd Msg) 
init = 
    -- (Model 0, f()) 
    (Model 0, send Ask) 


send : msg -> Cmd msg 
send msg = 
    Task.perform identity identity (Task.succeed msg) 
+0

나는 "디자인 결정"을하기에 충분한 엘름을 가지고 있지 않다 ... –

+0

우 엘메 0.17이므로 문법 변경이있을 수있다 –

+0

나는 확실히 체크를했다. 나는'console.log'를 사용해 보았습니다. –

2

, 당신은 programWithFlags을 사용할 수 있습니다 제거 :

포트에 데이터를 전송하는 메시지를 보낼 init을 변경하십시오

:

main = 
    Html.programWithFlags 
    { init = init 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

-- INIT 
type alias Flags = { initialValue : Int } 

init : Flags -> (Model, Cmd Msg) 
init flags = (Model flags.initialValue, Cmd.none) 

이이 같은 자바 스크립트를 통해 그 초기 값을 보낼 수 있습니다 : 필요성이 아직 설정되지 않은 포트에 와이어 시도

var app = Elm.FooBar.embed(node, { initialValue : 2 }); 
관련 문제