有没有办法用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());
为了对此事件进行重新加载,内容全部消失。我做错了什么?
答案 0 :(得分:4)
我认为一种方法是定期执行App.Message.find() - ember将处理你的观点更新
window.setInterval(function(){App.Message.find()},1000);
如果我错了,请纠正我 - 我还在学习余烬
答案 1 :(得分:3)
我终于明白了这一点,虽然我喜欢一个灰烬专家告诉我原因。
如果我使用promises然后()来获得真实结果,然后在控制器上设置它,它就可以工作:
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调用往返时没有闪烁 - 数据只有在完成时才会被交换。