如何从外部模块生成Pux操作?

时间:2016-12-05 16:19:46

标签: javascript codemirror purescript purescript-pux

我尝试使用静态代码编辑器purescript-puxCodeMirror编写应用程序。

CodeMirror使用text-area编辑,但事件的处理方式不同,因此我无法使用onChange中的Pux.Html.Events函数。

要在CodeMirror编辑器中处理输入更改,应该这样做:

CodemirrorInstance.on('change',function(cMirror){
  // get value right from instance
  var newValue = cMirror.getValue();
});

我能够制作一个微不足道的Codemirror实例。我遇到的问题是如何让pux知道这些事件。

我有一个Channel我已订阅并用于处理websocket消息,但我真的不知道如何从外国JavaScript文件中发送一些东西。

1 个答案:

答案 0 :(得分:0)

您可能只需在外部模块上设置信号(purescript-signal)。

也许是这样的:

// type it, read the CodeMirror Docs.
type CMChange = 
    { from :: CMCoordinate
      to :: CMCoordinate
      text :: Array String
      removed :: String
      origin :: ??
    }

foreign import _CMChangeSignal :: forall eff change. (change -> Signal change) -> Eff (dom :: DOM | eff) (Signal CMChange)

cmChanged :: forall eff. Eff (dom :: DOM | eff) (Signal CMChange)
cmChanged = _CMChangeSignal constant

main :: Eff (CoreEffects (dom :: DOM)) Unit
main = do
  urlSignal <- sampleUrl
  let routeSignal = urlSignal ~> (PageView <<< match)
  -- create signal then map it to your Action
  cmSignal <- cmChanged
  let cmChangeSignal = cmSignal ~> CodeMirrorChangedAction

  app <- start
    { initialState: init
    , update: update
    , view: view
    , inputs: [routeSignal, cmChangeSignal]
    }

  renderToDOM "#app" app.html

然后在你的purescript文件上:

constant

boost::edge_weight_t EdgeWeightPropType; 是Pux所依赖的“purescript-signal”中定义的函数。