Ember组件可以观察控制器属性吗?

时间:2014-09-29 15:41:19

标签: ember.js

我有一个控制器和一个组件。在渲染组件时,它以这种方式传递:

{{modal-filter feature=feature parentController=this.controller}}

其中feature是通过控制器传递给把手的param,而parentController是控制器。

现在,在控制器本身中,有一个属性(数组)。让我们调用那个数组requiredValues。

现在在控制器/组件本身内,我们可以轻松设置:

valueObserver : function(){
     ...
}.observes('requiredValues')

但是,我需要从模态过滤器组件中观察此控制器属性。所以在模态过滤器组件中,我将把什么作为观察者函数:

valueObserver : function(){
     ...
}.observes(???)

2 个答案:

答案 0 :(得分:22)

将整个控制器传递给组件是一种巨大的代码味道。它违反了组件封装的基本原则。如果“组件”与控制器紧密耦合,那么它就是一个视图,您可以通过简单地说this.controller来访问控制器。组件的输入应严格通过调用时传入的参数。组件的输出是通过send,控制器可以通过说{{my-component action='eraseHardDisk'}}在视图的模板中映射到它所选择的某些行为。

您无需在组件内直接观察控制器上的任何内容。如果您使用{{my-component param=someProperty}}调用该组件,则对控制器someProperty的任何更改都将自动传播到组件的param。然后,组件可以在param上定义一些计算属性,或者观察它,或者在它自己的模板中使用它,它将自动保持最新。

答案 1 :(得分:15)

你不该做什么,但我会告诉你如何完整

如果您正在通过控制器,您可以只在parentController属性上观看一个项目,虽然我根本不会推荐这个项目

valueObserver : function(){
     ...
}.observes('parentController.requiredValues')

这将假设整个阵列正在被替换,而不仅仅是添加或更改的项目。

项目已添加或删除

valueObserver : function(){
     ...
}.observes('parentController.requiredValues.[]')

项目属性foo在其中一个requiredValues项目

上更改
valueObserver : function(){
     ...
}.observes('parentController.requiredValues.@each.foo')

你应该做什么

不要传入控制器,只需传入属性,然后观察属性。

{{modal-filter feature=feature property=someProperty}}


propertyObserver : Ember.observer('property', function(){
     ...
})