我们应该通过行动或数据与组件沟通

时间:2016-02-01 20:38:54

标签: ember.js

我对什么是更好的方法感到困惑,我们是否更愿意通过数据或动作更多地在组件,组件/控制器之间进行通信?

这是一个例子:我有一个文件上传器组件(包装jquery插件),我有组件设置的方式是这样的:

1)包含文件上传器组件的控制器定义了一个属性,两个实体将通过该属性共享有关正在上载的文件的信息

//some controller template
//where uploadedFiles is a property of the context controller
{{file-uploader uploadedFiles=uploadedFiles}}

2)此属性被传递给组件,当我们启动上载时,组件会使用错误/进度等填充它。此数据对象的结构如下所示:

{
   'file': file object we get from plugin
   'errors': [],
   'progress':10,
   .... 
}

此组件还执行一些基本文件验证,例如文件类型和大小。发生这些错误时,我们会填充错误的数据对象。现在我正在辩论 - 我是否应该在每次自定义验证失败时触发一个动作,或者是否可以让控制器中的观察者检查数据对象然后触发它需要的任何动作。

我更倾向于通过数据本身来传达信息,因为它使通信界面更加清晰,但我也理解它会花费观察者的开销。

另一方面,通过行动避免了观察员,但我不完全同意,因为那时我们可能会有10种其他情况,我们可能会感觉自己已经过了行动"是正确的选择,然后污染组件代码(当它可以通过数据进行通信时)。

我确实同意在某些情况下我们必须通过行动,但如果选择通过绑定数据传达事物,行动是更好的选择吗?

感谢。

2 个答案:

答案 0 :(得分:4)

我觉得,你最好采取行动。我使用Ember大约两年,根据我的经验,观察者是不可预测的,很难调试。

如果您的观察者只是一行而不是问题。但是数量代码几乎总是在增长,因此它将变得越来越复杂。

动作可以让您更好地控制参数,更清晰的界面,并且更容易跟踪和预测数据流。

在我们的ember应用程序中,我们有数百名跨控制器的观察者,我们正在慢慢尝试尽可能地进行清理。

我并不反对观察者,但只有在你没有任何其他方式来实现某些目标时才应该使用它们。 以下是来自Dockyard(Ember Experts)的开发人员的broad explanation,了解为什么观察者是反模式的,应该避免使用。

答案 1 :(得分:1)

在我们讨论观察员之前,我们真正要问的问题是:

  

组件应该改变他们的论点吗?

如果我们将Component视为一个函数(我们传递数据,它会做一些事情),我们可以提升一个抽象层次:

  

函数应该改变他们的论点吗?

这是一个老问题。它实际上是命令式编程(可变数据)与函数式编程(不可变数据)。 Ember和React都在走向一种不可改变的风格,其中儿童组件不会改变他们通过的论点。一些例子:

因此,社区最佳实践是使用操作从子组件到其父上下文进行通信。并通过数据与子组件进行通信。

现在,假设您要直接在Component中改变数据 - 并且您希望在父控制器中做一些响应 - 观察者提出的原因是我们需要一些方法来引起基于的副作用数据的变化。有时您可以选择使用Computed Property。

观察员的情况如此糟糕?与计算属性不同,它们是同步和渴望的 - 这使得观察者比计算属性更棘手,尽管它们都对数据的变化做出反应。除了Lauren Tan's article(kushdilip也与之相关),Stefan Penner does a great job explaining this

如果您担心通过大量操作污染组件代码,我会在Ember 2中查看ember-composable-helpersmut帮助程序。很多操作代码都可以实际上被推入你的模板。