2016-05-11 9 views
3

Для вяза 0.16, я определил некоторые порты (которые только Signal данных) без основной функции и используется Signal.map для обработки данных туда и обратно. Это просто для обработки данных, вызванной из nodejs (не из браузера), , поэтому я не могу зависеть от модуля Html.Как создать рабочий с вязом 0,17

Сейчас вяз 0,17 имеет Cmd и Sub вместо Signal, я не могу понять, как сделать то же самое ...

Кто-нибудь может дать мне простой пример, чтобы сделать обработку ДАННЫЕ через порты выставляемых worker инициализации с вязанием 0,17?


Вот мой простой пример с Elm 0.16 ...

вяза 0,16 Код:

module Main where 
import Signal 
import String exposing (isEmpty, reverse) 

-- input ports 
port jsToElm : Signal String 

-- output ports 
port elmToJs : Signal String 
port elmToJs 
    = Signal.map String.reverse jsToElm 

Javascript (ES6) Код:

/** main */ 
const Elm = loadElm('./index.js') // custom function to eval Elm code 
const app = Elm.worker(Elm.Main, { jsToElm: ''}) 

app.ports.jsToElm.send('test') 

app.ports.elmToJs.subscribe((txt) => {  
    console.log(txt) 
}) 

ответ

4

Update

Существует в настоящее время пакет, который дает возможность создать рабочий. См lukewestby/worker

Оригинал ответа

Я был в состоянии получить рабочий пример, создав программу Html.App. Я не могу найти никакого отношения к требованию наличия функции main, которая приводит к программе, которая включает в себя функцию view и I'm not alone in that confusion.

Мой пример здесь основан на браузере, мы надеемся, что это будет соответствовать вашей версии на основе узлов; Я раньше не использовал версию узла.

Main.elm:

port module Main exposing (..) 

import Json.Decode 
import Json.Encode 
import Html exposing (..) 
import Html.App 

import String exposing (isEmpty, reverse) 

-- input ports 
port jsToElm : (String -> msg) -> Sub msg 

-- output ports 
port elmToJs : String -> Cmd msg 

type alias Flags = { jsToElm : String } 

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

type alias Model = { text : String } 

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

type Msg 
    = Reverse String 

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
    Reverse str -> 
     let reversed = reverse str 
     in ({ model | text = reversed }, elmToJs reversed) 

view : Model -> Html.Html Msg 
view model = 
    text <| "text is: " ++ model.text 

subscriptions : Model -> Sub Msg 
subscriptions _ = 
    jsToElm Reverse 

индекс.HTML:

<script type="text/javascript" src="Main.js"></script> 
<script type="text/javascript"> 
var app = Elm.Main.fullscreen({ 
    jsToElm: 'first' 
}); 

window.setTimeout(function() { 
    app.ports.jsToElm.send('test'); 
}, 1); 

app.ports.elmToJs.subscribe(function (txt) {  
    console.log(txt) 
}); 
</script> 

Пара: вынос

  1. Как вы можете видеть, простое отображение сигналов исчезает, и есть намного больше шаблонного для такого небольшого примера. Идея заключается в том, что вы настроили свою подписку на порт, а затем отправили Cmd внутри функции update, когда хотите отправить информацию обратно в Javascript.
  2. Для всего этого объекта Cmd/Sub требуется Program, и единственный способ сделать это (чтобы я мог найти) состоял в том, чтобы включить [Html.App]. У меня есть догадка, что в будущем ядро ​​Router можно использовать для создания «безголового» рабочего, но похоже, что сейчас мы застреваем с требованием программы Html.App и должны визуализировать представление.
  3. Вы увидите сообщение setTimeout при отправке "test" в порт в javascript. Я не уверен, почему этот ляп является необходимым, но others have seen it before as well
+0

Благодарим вас за помощь. Грустно видеть, что мы должны сейчас использовать уродливую работу. Надеюсь, он будет исправлен. Еще раз спасибо. – Tosh

1

upgrade guide идет в это, но я кратко здесь со ссылками на ваш код:

Входной порт:

-- 0.16 
port jsToElm : Signal String 

-- 0.17 
port jsToElm : (String -> msg) -> Sub msg 

Выходной порт:

-- 0.16 
port elmToJs : Signal String 

-- 0.17 
port elmToJs : String -> Cmd msg 

new Elm guide объясняющей как это сделать.

+0

Как подключить входной порт в выходной порт (в Эльм 0.16, я использую 'Signal.map' напрямую соединить их)? В примере, приведенном в руководстве по миграции, используется 'Html.App', которого у меня нет или нет. – Tosh

+0

@Tosh: Честно говоря, я не уверен. Документация для людей, которые не используют 'Html.App', кажется действительно странно ограничена в новом руководстве. –

+1

Большое спасибо за обновление в любом случае ... По крайней мере, я знаю, что я не единственный, кто не может найти информацию за пределами использования «Html.App». Я буду ждать других предложений. – Tosh