我们正在使用Ember.Data rev 11.我们的关系是这样的:
Social.Account = DS.Model.extend({
name: DS.attr("string"),
username: DS.attr("string"),
messages: DS.hasMany("Social.Message"),
});
Social.Message = DS.Model.extend({
text: DS.attr("string"),
created: DS.attr("date"),
account: DS.belongsTo("Social.Account"),
posts: DS.hasMany("Social.Post")
});
Social.Post = DS.Model.extend({
text: DS.attr("string"),
created: DS.attr("date"),
message: DS.belongsTo("Social.Message"),
});
用户创建一条消息,然后可以将其发送到多个社交媒体帐户,每个帐户都会生成一个帖子。在提交时,会创建一条消息和帖子记录,但我们会在Twitter上从Post记录中获取信息。我们目前使用的代码如下所示:
saveMessage: function(text){
var acct = Social.Account.find(this.get("id")),
msg = Social.store.createRecord(
Social.Message,
{
text: text,
account: acct,
created: new Date()
}
);
acct.get("messages").addObject(msg);
Social.store.commit();
msg.addObserver('id', this, function(){
var timeoutID = window.setTimeout(function(){
msg.reload();
console.log('reloading');
}, 5000);
});
}
一旦我点击提交消息并在UI中发布两个加载。问题是Post缺少了native_url属性,只有在发出对Twitter的http请求后才能获取。奇怪的是,如果我用一个警告窗口替换addObserver调用的内容,native_url值就会弹出。我不确定为什么,但确实如此。
无论如何,所以我的问题是我需要做些什么来使用服务器中的数据更新Post对象,并用新数据更新UI。
答案 0 :(得分:2)
我不能保证这是解决方案而不会看到所有代码。但是你要做的一件事就是不要依赖setTimeout
来进行Ember回调。相反,请使用Ember.run.later。
Ember.run.later(this, function() {
this.reload();
console.log('reloading');
}, 5000);
在Ember之外异步发生的任何事情都应该包含在RunLoop中。因此,如果您的回调是插件的一部分或其他类似的东西,您也可以将它全部包装在Ember.run中。