来自未触发的路径的控制器属性上的观察者

时间:2015-04-08 17:24:20

标签: javascript ember.js

我正在尝试将一个观察者放在路径中的控制器属性上,但观察者永远不会被解雇。

这是一个基本示例,其中应用程序路由具有在子路由的控制器上设置属性的操作。子路径在控制器的属性(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
});

2 个答案:

答案 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