Ember.js:控制器之间的数据绑定

时间:2013-02-07 20:58:22

标签: data-binding controller ember.js

我正在尝试将ApplicationController绑定到IndexController。 Here is my jsfiddle。总而言之,这是我在Application controller

中的绑定
indexIsClickedBinding: "App.indexController.isClicked",

isIndexClicked: function() {
    alert("its changed to " + this.get("indexIsClicked") ) ;
}.observes('indexIsClicked'), 

因此,当IndexController中的 isClicked 值发生更改时,indexIsClickedBinding不会执行任何操作。我的代码中有什么错误的建议吗?

干杯

2 个答案:

答案 0 :(得分:23)

虽然解决方案很简单,但我试着解释一下。如果您不确定,请随时提出任何问题。

您已绑定到App.indexController实例上的某个媒体资源。但是,此实例不存在,因为Ember.JS不再将控制器的实例直接放在App上。

它曾经驻留在以前版本的Ember中App上,但不再存在,因为使用其绝对名称引用控制器是不好的做法,因为它在两者之间创建tight coupling控制器。

这就是为什么Ember.JS有其他方法可以引用控制器。在当前控制器中需要其他控制器是一种常见的要求。 Ember.JS有以下方法:

因此,如果我们实现needs,那么您的控制器现在可以访问其他控制器以及它拥有的属性:http://jsfiddle.net/uB5tX/7/

通过使用needs,我们松散地耦合了控制器。我们用它的名字引用它,Ember.JS将为我们查找控制器。如果我们改变App那么我们就不需要改变任何东西,如果/当Ember.JS改变了控制器的行为时,我们不需要再次更新我们的needs,因为当行为时更改,然后needs也将更新,带回正确的控制器。

答案 1 :(得分:0)

您还可以使用以下语法访问其他控制器的属性:

import Ember from 'ember';

export default Ember.Controller.extend({
  index: Ember.inject.controller('index'),
  indexIsClicked: Ember.computed.alias("index.isClicked"),

  isIndexClicked: Ember.observer('index.isClicked', function() {
    alert("its changed to " + this.get("indexIsClicked"));
  })
});

但是你需要让Ember首先初始化这个控制器,所以你实际上需要调用一些取决于index的计算属性(它将懒惰地初始化它)。因此,例如在模板中我使用:

Is index clicked: <b>{{indexIsClicked}}</b>

Working demo.