Ember.js - 查看isVisible(或任何变量)绑定到控制器状态

时间:2013-03-10 19:11:33

标签: ember.js

正如文档中所读到的,控制器永远不应该在其关联的视图上调用方法或更改属性,而是视图应该绑定其关联控制器的状态。

有这个:

App.MyController = Ember.Controller.extend({
    myViewVisible:false,
    toggleViewVisibitity:function(){
        this.set('myViewVisible', !this.get('myViewVisible'));
    }
}
App.MyView = Ember.View.extend({
    isVisible:function(){
        return this.get('myViewVisible');
    }.observes('myViewVisible')
}

当我从另一个控制器调用toggleViewVisibility时,视图中没有任何反应。

我怎样才能做对?

提前致谢

1 个答案:

答案 0 :(得分:8)

它应该以这种方式工作:

App.MyController = Ember.Controller.extend({
    myViewVisible:false,
    toggleViewVisibitity:function(){
        this.set('myViewVisible', !this.get('myViewVisible'));
    }
}
App.MyView = Ember.View.extend({
    isVisible:function(){
        return this.get('controller.myViewVisible');
    }.property('controller.myViewVisible'),
    // even shorter version of the above
    isVisible : Ember.computed.alias("controller.myViewVisible")
}

您的代码需要更改:

  1. 我将View的isVisible属性从观察者更改为属性。每次观察属性更改时,观察者都会触发(=函数执行)。所以这不是你需要的。但是你想把它定义为属性,所以可以通过Ember访问它:view.get(“isVisible”)。因此我把它改成了财产。
  2. 我更改了您的媒体资源。 在属性控制器上为您的视图分配了一个控制器。因此,您需要在控制器前面添加所需属性,以便访问它。
  3. 如您所见,在Ember.computed.alias 的帮助下,我还提供了一个甚至更短版本的逻辑,但我想先向您展示更详细的解决方案。