我有一个控制器和一个组件。在渲染组件时,它以这种方式传递:
{{modal-filter feature=feature parentController=this.controller}}
其中feature是通过控制器传递给把手的param,而parentController是控制器。
现在,在控制器本身中,有一个属性(数组)。让我们调用那个数组requiredValues。
现在在控制器/组件本身内,我们可以轻松设置:
valueObserver : function(){
...
}.observes('requiredValues')
但是,我需要从模态过滤器组件中观察此控制器属性。所以在模态过滤器组件中,我将把什么作为观察者函数:
valueObserver : function(){
...
}.observes(???)
答案 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.[]')
valueObserver : function(){
...
}.observes('parentController.requiredValues.@each.foo')
不要传入控制器,只需传入属性,然后观察属性。
{{modal-filter feature=feature property=someProperty}}
propertyObserver : Ember.observer('property', function(){
...
})