Mithril js - 跨组件通信模式

时间:2014-12-28 22:10:20

标签: javascript functional-programming mithril.js

我在这里{(3}}有一个不同的跨组件通信实现,而不是这里描述的http://jsfiddle.net/c641oog2/。目标是创建一个易于集成的&可扩展的(在其他组件中重复使用)组件,即图书馆化。

我的代码的主要部分:

var autocompleter = function(options) {
  ...
  autocompleter.vm = {
    list: m.prop(options.list || []),
    observers: m.prop(options.observers || []),
    ...
select: function(item) {
  for(observer in autocompleter.vm.observers()) {
    autocompleter.vm.observers()[observer](item); //notify all observers of selection
  }
}
  //initialization later on...
  this.userAC = new autocompleter({list: this.users(), observers: [this.selectedUser]})

主要区别在于组件如何相互通信。在我的实现中,我决定使用观察者,并且在文档的实现中,他通过创建纯函数来实现,然后在" view"仪表板的功能,正确的参数传递给"视图"自动完成功能的功能。

我的问题:

  1. 如果您必须在这两个实现之间进行选择,为什么要选择其中一个呢?
  2. 在函数式编程模型中,是一个OOP概念,例如观察者模式不赞成?
  3. 是否有更简洁但可扩展的方式在FP /使用不同的模式实现这一点?

2 个答案:

答案 0 :(得分:1)

很好的例子。看起来很简洁。用“j”,“b”或“m”开始输入的一点提示将避免需要读取所有代码或假设示例已被破坏;)

对于像仪表板和子视图这样的中心辐射吸气剂/设定器布置,观察者模式只是增加了额外的开销而没有任何解耦优势,因为仪表板必须始终启动子视图。

如果“项目”子视图会观察“用户”子视图,那将更有意义。这将允许子视图之间复杂且可重复使用的逻辑,其中轻量仪表板仅限于启动。

答案 1 :(得分:0)

就个人而言,我更喜欢纯粹的'版本,而不是观察者模式。我认为从概念上讲它更简单。没有跨组件的沟通,它在父母和子女之间都是垂直的。

此外,您(在我看来)打破了UI状态是数据的想法,因此理想情况下永远不会重复。

这意味着如果您创建了想要与其余部分进行交互的新组件,则它们都需要保留所选状态的副本,而不是所有观察单个UI状态模型。