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

Observer on a controller property from a route not firing

我正在尝试从路线内将观察者放置在控制器 属性 上,但观察者永远不会被解雇。

这是一个基本示例,其中应用程序路由具有在子路由控制器上设置 属性 的操作。子路由在控制器的 属性 (controller.isDirty) 上有一个观察者 (cleanup),它永远不会被触发。我不知道为什么。

如有任何帮助,我们将不胜感激。

fiddle: 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
});

是的,'controller' 属性 在一条路线中是不可观察的。参见 https://github.com/emberjs/ember.js/issues/9370

如果您在 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/

本质上,这是针对 Gaurav 提到的控制器不可观察性的肮脏工作。只要控制器没有改变,这应该就可以工作(它不应该,因为它无论如何都被视为一个单例,但如果你做一些不正常的事情,它可能会成为一个问题)。