【问题标题】:Requerying model data in Ember.js route在 Ember.js 路由中重新查询模型数据
【发布时间】:2013-06-12 14:53:35
【问题描述】:

有没有办法使用 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() {}
        });
    },

});

这很有效 - 它在静态意义上正确排序和跳过。

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

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

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

this.controller.set('content', this.query());

响应此事件重新加载,内容全部消失。我做错了什么?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    我认为一种方法是定期执行 App.Message.find() - ember 将处理您的视图更新

    window.setInterval(function(){App.Message.find()},1000);
    

    如果我错了,请纠正我 - 我还在学习 ember

    【讨论】:

    • 对不起 - 我在最初的帖子中过于简化了情况。我有一个更复杂的查询,只是一个简单的 find all 所以我认为这不会起作用。我编辑并扩展了我的问题。
    【解决方案2】:

    我终于想通了,尽管我希望余烬专家告诉我原因。

    如果我使用 promises 和 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() {}
        });
    },
    

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

    【讨论】:

    • Ember.Route 上的模型方法可以返回一个 Promise,但如果返回,则路由器在调用 setupController() 之前等待 Promise 解析或失败。控制器本身总是期望一个具体的模型,而不是一个承诺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2013-11-04
    • 1970-01-01
    • 2016-04-20
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多