2016-01-12 5 views
4

В моем приложении, основанном на пакете StartApp, у меня есть порт для связи изнутри JS. На данный момент я называю этот порт, используя почтовый ящикКак использовать порты внутри StartApp в Elm

requestPalette : 
    { address : Signal.Address String 
    , signal : Signal String 
    } 
requestPalette = Signal.mailbox "" 


requestPaletteFilter : Signal String 
requestPaletteFilter = 
    Signal.filter (String.isEmpty >> not) "" requestPalette.signal 
    |> settledAfter (300 * Time.millisecond) 


port request : Signal String 
port request = requestPaletteFilter 

и использовать его как это:

[on "input" targetValue (\str -> Signal.message requestPalette.address str) 

Интересно, если есть путь к этой внутренней функции update вместо отправки сообщения из вид.

ответ

5

Это относится к вязу 0.16 (и выше), в вязе 0,17 подписок изменились в порты

Для того, чтобы отправить сигнал в почтовый ящик от обновления, вы должны будете использовать StartApp в противоположности до StartApp.Simple, поскольку первый позволяет использовать эффекты в функции update.

Как минимум, вы собираетесь, вероятно, такое действие, как это, который определяет No-Op и действие для отправки запроса строки:

type Action 
    = NoOp 
    | SendRequest String 

Ваша update функция теперь будет включать в себя что-то как следующий случай для нового действия SendRequest. Поскольку вы используете StartApp, который имеет дело с эффектами, вы должны позвонить Effects.task, а задача, которую вы настраиваете для Эффекта, должна иметь тип Action, поэтому у нас есть возвращаемое значение Task.succeed NoOp.

update action model = 
    case action of 
    NoOp -> 
     (model, Effects.none) 
    SendRequest str -> 
     let 
     sendTask = 
      Signal.send requestPalette.address str 
      `Task.andThen` (\_ -> Task.succeed NoOp) 
     in 
     (model, sendTask |> Effects.task) 

Теперь ваш Обработчик события щелчка в окне может вернуться к использованию address передается в поле зрения:

[ on "input" targetValue (Signal.message address << SendRequest) ] 

У меня есть рабочий пример выше в this gist. Вам просто нужно подписаться на порт request в javascript, чтобы увидеть его в действии.

+0

Возможно, мой вопрос был не ясен, но я хочу, чтобы comuncat от Elm до JS не был наоборот –

+0

Спасибо, но это все еще не ответ на вопрос, у меня нет проблем с отправкой сообщения, вопрос в том, как отправьте его с помощью функции «update», чтобы сообщение только отправляло сообщение на главный адрес, а каждое другое сообщение выполнялось в центральном месте. –

+0

В этом случае, я думаю, я понимаю, что вы сейчас получаете, но не могли бы вы обновить свой вопрос на примере (возможно, упрощенном) того, как выглядит ваш код StartApp, с включенной функцией обновления? –

Смежные вопросы