我正在尝试将一个观察者放在路径中的控制器属性上,但观察者永远不会被解雇。
这是一个基本示例,其中应用程序路由具有在子路由的控制器上设置属性的操作。子路径在控制器的属性(cleanup
)上有一个观察者(controller.isDirty
),它永远不会被触发。我无法弄清楚为什么。
任何帮助都将不胜感激。
小提琴:http://jsfiddle.net/ujwyvhrp/3/
App = Ember.Application.create();
App.Router.map(function () {
this.route('child');
});
App.ApplicationRoute = Ember.Route.extend({
model: function () {
return true;
},
actions: {
makeDirty: function(){
this.controllerFor('child').set('isDirty', true);
}
}
});
App.ChildRoute = Ember.Route.extend({
model: function () {
return true;
},
cleanup: function(){
this.controller.set('isDirty',false);
}.observes('controller.isDirty')
});
App.ChildController = Ember.Controller.extend({
isDirty: false
});
答案 0 :(得分:3)
如果您在setupController中注册观察者(即,在实例化控制器之后,如果需要),它可以工作。
App.ChildRoute = Ember.Route.extend({
model: function () {
return true;
},
setupController: function(controller, model) {
this._super(controller, model);
this.addObserver('controller.isDirty', function() {
this.controller.set('isDirty',false);
});
}
});
这不是一个完整的解决方案(你必须在某个时候删除Observer),但希望能指出正确的方向。请参阅:http://jsfiddle.net/ujwyvhrp/4/
基本上这是一个肮脏的工作,因为控制器的不可观察性提到了bei Gaurav。只要控制器没有改变(这不应该,因为它无论如何都被视为单身,但是如果你做一些不正常的事情可能会成为一个问题),这应该可以工作。
答案 1 :(得分:0)
是的,路线中的'controller'属性是不可观察的。见https://github.com/emberjs/ember.js/issues/9370