【问题标题】:Can an Ember component observe a controller property?Ember 组件可以观察控制器属性吗?
【发布时间】:2014-09-29 15:41:19
【问题描述】:

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

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

其中 feature 是通过控制器传递给车把的参数,而 parentController 是控制器。

现在,在控制器本身中,有一个属性(一个数组)。让我们称该数组为 requiredValues。

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

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

但是,我需要从模态过滤器组件中观察这个控制器属性。那么在 modal-filter 组件中,我将把什么作为观察者函数:

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

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您让我意识到这种代码异味。我确实重构了我的代码,只将所需的数据作为参数传递,并通过 sendAction() 函数发送输出。你是对的 - 组件应该是独立的;我在某处读到该组件知道控制器但控制器不知道该组件并且我误解了它。谢谢;非常感谢。
    • 如果涉及基于 Javascript 的渲染,则绑定不起作用。
    【解决方案2】:

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

    如果您要传入控制器,则可以只在 parentController 属性上观看一个项目,虽然我根本不推荐这样做

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

    这将假定整个数组被替换,而不仅仅是添加或更改的项目。

    添加或删除项目

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

    Item 属性 foo 在其中一项 requiredValues 项上发生了变化

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

    你应该怎么做

    不传入控制器,只传入属性,观察属性。

    {{modal-filter feature=feature property=someProperty}}
    
    
    propertyObserver : Ember.observer('property', function(){
         ...
    })
    

    【讨论】:

    • 谢谢。这绝对有效,但我必须接受 torazaburo 的建议,因为传入控制器确实看起来像代码味道。然而,问题是“如何观察控制器内的属性”,所以这个答案在技术上是正确的。这也是正确的答案 - 它有效。
    • 您能否确定正在为observes('parentController.values.[]') 案例添加/删除的项目。
    • 不使用这个,但是可以使用addArrayObserveremberjs.com/api/classes/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多