我对什么是更好的方法感到困惑,我们应该更喜欢通过数据或操作在组件、组件/控制器之间进行通信吗?
下面是一个示例:我有一个文件上传器组件(包装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种情况,我们可能会觉得传递"action“是正确的选择,然后污染组件代码(当它可以通过数据通信时)。
我确实同意,在某些情况下,我们必须采取行动,但如果选择可以通过绑定数据进行沟通,那么行动是更好的选择吗?
谢谢。
发布于 2016-02-01 21:27:25
我觉得,你最好行动起来。我使用Ember大约两年,根据我的经验,观察者是不可预测的,真的很难调试。
如果你的观察者只是一行不成问题。但是数量代码几乎总是在增长,因此它将变得越来越复杂。
操作将使您更好地控制参数、更清晰的界面,并且可以更容易地跟踪和预测数据流。
在我们的余烬应用程序,我们有数百个观察员跨控制器和我们慢慢尝试清理尽可能多。
我不反对观察者,但只有当你没有其他方法去达到目标时,他们才能被使用。这是一个来自码头开发人员(Ember专家)的广义解释,它解释了为什么观察者是反模式的,应该避免。
发布于 2016-03-06 07:27:33
在我们讨论观察者之前,我们真正要问的问题是:
组件应该改变它们的论点吗?
如果我们将组件看作一个函数(我们传递给它数据,它做了一些事情),那么我们可以提升抽象级别:
职能应该改变他们的论点吗?
这是个老问题。它实际上是关于命令式编程(可变数据)和函数式编程(不变数据)。Ember和React都在向不变的样式发展,在这种风格中,子组件不会对传递的参数进行变异。这方面的一些例子:
因此,社区最佳实践是使用操作从子组件到其父上下文进行通信。并通过数据与子组件进行通信。
现在,假设你要在组件中直接变异数据--你想要做一些响应,在父控制器中--观察者出现的原因是,我们需要一些方法来根据数据的变化来产生副作用。有时,您可以选择使用计算属性。
观察者有什么不好的?与计算属性不同的是,它们是同步的和渴望的--这使得观察者比计算属性更棘手,尽管它们都对数据的变化作出反应。除了劳伦·谭的文章 ( kushdilip也链接到),Stefan Penner 解释得很好吗?。
如果您担心大量操作会对组件代码造成污染,我会查看Ember 2中的余烬-可合成-帮手和mut
助手,很多操作代码实际上可以被推入模板中。
https://stackoverflow.com/questions/35139862
复制