5

我正在尝试将 ApplicationController 绑定到 IndexController。这是我的 jsfiddle。总而言之,这是我在应用程序控制器中的绑定

indexIsClickedBinding: "App.indexController.isClicked",

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

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

干杯

4

2 回答 2

23

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

您已绑定App.indexController. 然而,这个实例并不存在,因为 Ember.JS 不再将控制器的实例直接放在App.

它曾经驻留在AppEmber 的早期版本中,但现在不再存在,因为使用其绝对名称引用控制器是不好的做法,因为它会在控制器之间创建紧密耦合

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

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

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

于 2013-02-07T23:15:37.977 回答
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>

工作演示。

于 2015-11-19T11:41:22.813 回答