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

Fif*_*ine 4 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')
}
Run Code Online (Sandbox Code Playgroud)

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

我怎么能做对的?

提前致谢

mav*_*ein 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")
}
Run Code Online (Sandbox Code Playgroud)

您需要更改代码:

  1. 我将View的isVisible属性从观察者更改为属性.每当观察到的属性发生变化时,观察者就会触发(=函数执行).所以这不是你需要的.但是你想把它定义为属性,所以可以通过Ember访问它:view.get("isVisible").因此我将其改为财产.
  2. 我更改了您的属性的从属密钥.控制器已分配给属性控制器上的视图.因此,您需要使用控制器为所需属性添加前缀以访问它.
  3. 如您所见,在Ember.computed.alias的帮助下,我还提供了更短版本的逻辑,但我想先向您展示更详细的解决方案.