Ember.js EmberJS:遵守父路线';s模型和更改子路由';s模型

Ember.js EmberJS:遵守父路线';s模型和更改子路由';s模型,ember.js,binding,master-detail,server-sent-events,Ember.js,Binding,Master Detail,Server Sent Events,我正在设置一个包含两条路线的主-细节界面。父路由包含定期更新其模型的EventSource流 当父管线的模型在其任何项目上发生更改时,我会尝试这样做,如果当前详图视图显示任何更改的项目,则应更新它 我目前正在尝试对接收器路由到接收器的控制器模型进行绑定,并观察到: 根据blessenm的建议编辑: var App = Ember.Application.create({ rootElement: '#content' }); App.Router.map(function() {

我正在设置一个包含两条路线的主-细节界面。父路由包含定期更新其模型的EventSource流

当父管线的模型在其任何项目上发生更改时,我会尝试这样做,如果当前详图视图显示任何更改的项目,则应更新它

我目前正在尝试对
接收器
路由到
接收器
的控制器模型进行绑定,并观察到:

根据blessenm的建议编辑:

var App = Ember.Application.create({
    rootElement: '#content'
});

App.Router.map(function() {
    this.resource('receptores', {path: '/'}, function() {
        this.resource('receptor', {path: ':user_id'});
    });
});

App.ReceptoresRoute = Ember.Route.extend({
    model: function() {
        var deferredData = Ember.Deferred.create();
        var data = [];
        var sse = new EventSource('/monitoreo/receptores/push');
        sse.addEventListener('update-receptores', function(e) {
            var receptores = JSON.parse(e.data);
            receptores.forEach(function(r) {
                var item = data.findBy('id', r.id);
                if (typeof(item) != 'undefined') {
                    data.replace(data.indexOf(item), 1, [r]);
                } else {
                    data.pushObject(r);
                }
            });
            deferredData.resolve(data);
        });
        sse.addEventListener('ping', function(e) {
            console.log('ping');
        });
        return deferredData;
    }
});

App.ReceptorRoute = Ember.Route.extend({
    model: function(params) {
        return this.modelFor('receptores').findBy('id', params.user_id);
    }
});

App.ReceptorController = Ember.ObjectController.extend({
    needs: ['receptores'],
    parentModelBinding: Ember.Binding.oneWay('controllers.receptores.model'),
    parentModelDidChange: function() { // never fires
        console.log('changed');
        this.set('model', this.modelFor('receptores').findBy('id', this.get('model').user_id));
    }.observes('parentModel')
});
这就是我目前所拥有的。发生的事情是,改变永远不会发生。使用chrome,我检查了
接收器的控制器,并且从未设置
parentModel
属性,我将其解释为绑定不起作用

我有一种感觉,我需要在
receptores
控制器上设置模型更改,而不是它的路径,但是当我尝试以下操作时,我得到异常
断言失败:每个循环所经过的值必须是一个数组。您通过了

我当前的解决方案。我将EventSource从
接收器路径中取出,并将其置于全局范围内。从
receptor
controller的
init
hook向其添加了一个事件侦听器

在我看来,这是不必要的。应该有一种方法将子控制器的模型绑定到父路由的数组模型中的相应项。源项上的更改应该立即反映在子项上,但我想这也取决于应用程序的设计

var App = Ember.Application.create({
    rootElement: '#content'
});

App.Router.map(function() {
    this.resource('receptores', {path: '/'}, function() {
        this.resource('receptor', {path: ':user_id'});
    });
});

var sse = new EventSource('/monitoreo/receptores/push');

App.ReceptoresRoute = Ember.Route.extend({
    model: function() {
        var deferredData = Ember.Deferred.create();
        var data = [];
        sse.addEventListener('update-receptores', function(e) {
            var receptores = JSON.parse(e.data);
            receptores.forEach(function(r) {
                var item = data.findBy('id', r.id);
                if (typeof(item) != 'undefined') {
                    data.replace(data.indexOf(item), 1, [r]);
                } else {
                    data.pushObject(r);
                }
            });
            deferredData.resolve(data);
        });
        sse.addEventListener('ping', function(e) {
            console.log('ping');
        });
        return deferredData;
    }
});

App.ReceptorRoute = Ember.Route.extend({
    model: function(params) {
        return this.modelFor('receptores').findBy('id', params.user_id);
    }
});

App.ReceptorController = Ember.ObjectController.extend({
    init: function() {
        var self = this;
        sse.addEventListener('update-receptores', function(e) {
            var current_id = self.get('model').id;
            JSON.parse(e.data).forEach(function(r) {
                if (r.id == current_id) {
                    self.set('model', r);
                }
            });
        });
    }
});

这只是一个想法。创建一个ReceptorController并将您的需求、绑定和oberserver放入其中。您可能还需要绑定到控制器的内容。parentModelBinding:Ember.Binding.oneWay('controllers.receptores.content')嗨,blessenm,谢谢。我试着像你说的那样,将模型钩子留在路由上,并将其他所有内容移动到ObjectController for receptor,同时使用controllers.receptores.model和controllers.receptores.content。parentModelDidChange仍未启动。我更新了代码以反映更改。
var App = Ember.Application.create({
    rootElement: '#content'
});

App.Router.map(function() {
    this.resource('receptores', {path: '/'}, function() {
        this.resource('receptor', {path: ':user_id'});
    });
});

var sse = new EventSource('/monitoreo/receptores/push');

App.ReceptoresRoute = Ember.Route.extend({
    model: function() {
        var deferredData = Ember.Deferred.create();
        var data = [];
        sse.addEventListener('update-receptores', function(e) {
            var receptores = JSON.parse(e.data);
            receptores.forEach(function(r) {
                var item = data.findBy('id', r.id);
                if (typeof(item) != 'undefined') {
                    data.replace(data.indexOf(item), 1, [r]);
                } else {
                    data.pushObject(r);
                }
            });
            deferredData.resolve(data);
        });
        sse.addEventListener('ping', function(e) {
            console.log('ping');
        });
        return deferredData;
    }
});

App.ReceptorRoute = Ember.Route.extend({
    model: function(params) {
        return this.modelFor('receptores').findBy('id', params.user_id);
    }
});

App.ReceptorController = Ember.ObjectController.extend({
    init: function() {
        var self = this;
        sse.addEventListener('update-receptores', function(e) {
            var current_id = self.get('model').id;
            JSON.parse(e.data).forEach(function(r) {
                if (r.id == current_id) {
                    self.set('model', r);
                }
            });
        });
    }
});