2

我们使用的是 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 返回的信息。我们当前使用的代码如下所示:

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。

4

1 回答 1

2

如果没有看到你们所有的代码,我不能保证这是解决方案。但是你应该做的一件事是不要依赖setTimeoutEmber 回调。相反,请使用Ember.run.later

Ember.run.later(this, function() {
    this.reload();
    console.log('reloading');
}, 5000);

在 Ember 之外异步发生的任何事情都应该包装在 RunLoop 中。因此,如果您的回调是插件的一部分或其他类似的东西,您也可以将它全部包装在Ember.run中。

于 2013-03-07T22:56:49.443 回答