在Ember.js路线中重新获取模型数据

out*_*344 6 ember.js

有没有办法用Ember.js做实时数据?

我正在寻找的是能够将更新和新记录(而不是删除)注入先前返回的结果.

所以,假设我有这样的路由器,它可以实现排序和分页(也就是跳过):

App.Router.map(function() {
    this.resource('messages', { path: '/messages/skip/:skip/sort/:sort/direction/:direction' });
});

App.MessagesRoute = Ember.Route.extend({

    model: function(params) {
        this.set('params', params);
        return this.query();
    },

    query: function() {
        var sort = {};
        sort[this.get('params').sort] = parseInt(this.get('params').direction);

        return App.Message.find({}, {
            skip: this.get('params').skip,
            sort: sort
        });
    },

    setupController: function(controller, model) {
        var self = this;
        this._super(controller, model);

        Ember.Instrumentation.subscribe('onMessage', {
            before: function(name, timestamp, message) {
                self.controller.set('content', self.query());
            },
            after: function() {}
        });
    },

});
Run Code Online (Sandbox Code Playgroud)

这很有效 - 它可以在静态意义上进行正确的排序和跳过.

(注意:我没有使用Ember数据 - 只是一组Ember对象.)

但是,消息不断到达,我希望这些消息的显示能够在消息到达时自动重新查询新消息.

我有一个websocket告诉我何时发生这种情况并且工作正常我正在使用Ember.Instrumentation基础设施将该事件路由到我拥有的setupController闭包.但是当我做的时候

this.controller.set('content', this.query());
Run Code Online (Sandbox Code Playgroud)

为了对此事件进行重新加载,内容全部消失.我究竟做错了什么?

out*_*344 3

我终于明白了这一点,尽管我希望有一位 Ember 专家告诉我原因。

如果我使用 Promise 和 then() 来获取真正的结果,然后将其设置在控制器上,它就会起作用:

setupController: function(controller, model) {
    var self = this;
    this._super(controller, model);
    Ember.Instrumentation.subscribe('onMessage', {
        before: function(name, timestamp, message) {
            var p = self.query();

            p.then(function(response) {
                self.controller.set('content', response);
            });
        },
        after: function() {}
    });
},
Run Code Online (Sandbox Code Playgroud)

我很想知道为什么 - 因为我认为 Ember 除了实际价值之外还可以接受承诺。也就是说,这个解决方案实际上更好,因为 REST 调用往返时没有闪烁 - 数据仅在完成时交换。