我正在尝试将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不会执行任何操作。我的代码中有什么错误的建议吗?
干杯
答案 0 :(得分:23)
虽然解决方案很简单,但我试着解释一下。如果您不确定,请随时提出任何问题。
您已绑定到App.indexController
的实例上的某个媒体资源。但是,此实例不存在,因为Ember.JS不再将控制器的实例直接放在App
上。
它曾经驻留在以前版本的Ember中App
上,但不再存在,因为使用其绝对名称引用控制器是不好的做法,因为它在两者之间创建tight coupling控制器。
这就是为什么Ember.JS有其他方法可以引用控制器。在当前控制器中需要其他控制器是一种常见的要求。 Ember.JS有以下方法:
this.controllerFor()
Ember.Route
:http://emberjs.com/guides/routing/setting-up-a-controller/
needs
告诉当前控制器需要访问哪些控制器:https://github.com/emberjs/ember.js/pull/1731 因此,如果我们实现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>