Ember.js:将记录保存到Ember.Data,等待显示前的响应

时间:2013-03-13 20:00:40

标签: javascript ember.js ember-data

我正在构建一个允许用户发布到Twitter的应用。当他们点击提交按钮时,我们会关闭发布表单。我们创建一个Message对象,该对象保存到数据存储并发送到服务器。服务器创建一个Post对象,然后向Twitter提交请求。然后,服务器更新Post对象,使用更新的信息回复UI。

那部分已经有效了。但我需要知道它是否不起作用,以便我可以提醒用户他们的消息没有通过并保持发布表单打开。以下是有关我的应用的一些相关信息。

Social.Message = DS.Model.extend({
    text: DS.attr("string"),
    created: DS.attr("date"),
    isPending: DS.attr("boolean"),
    posts: DS.hasMany("Social.Post")
});

Social.Post = DS.Model.extend({
    text: DS.attr("string"),
    status: DS.attr("string"),
    created: DS.attr("date"),
    message: DS.belongsTo("Social.Message"),
    msgStatus: function() {
        return ((this.get('status') === 'S') ? true : false);
    }.property('status')
});

帖子(状态)的生命周期从P(待定)到Q(排队)到S(已发送),E(错误)也是可能,以及我正在寻找的状态。这是saveMessage方法:

saveMessage: function(text){
    var acct = Social.Account.find(this.get("id")),
        msg = Social.store.createRecord(
                    Social.Message,
                    {
                        text: text,
                        created: new Date()
                    }
                );
    acct.get("messages").addObject(msg);
    Social.store.commit();
    Ember.run.later(this, function() {
        msg.get('posts').forEach(function(p){
            p.reload();
        });
    }, 1000);
}

您可以看到我暂停一秒钟让服务器进程,然后尝试使用Twitter的响应重新加载Post对象。最后几行是我认为这个新代码会去的地方,但我不确定如何倾听那些可能不会回来的东西。我宁愿不“等待”一秒钟,相反,如果消息可以更新,那就太好了。不知道怎么做到这一点。

思想?

2 个答案:

答案 0 :(得分:3)

创建记录后,您需要将代码作为回调运行。这是如何:

msg.one('didCreate', function() {
    // transition to new route showing data just created
});
Social.store.commit();

这将在记录创建时添加一次性调用。还有'didUpdate'和'didDelete'钩子。您需要在调用create之前添加这些回调(显然)。

我不知道如何处理错误情况,因为我还没有考虑过。

修改:这实际上是按https://github.com/emberjs/data/issues/405打破的,所以等待可能是目前唯一的选择。

答案 1 :(得分:0)

听起来你不想在这里进行双向数据绑定,你可能会从单向获益。这是一篇很棒的全文博客文章,深入解释了它

http://www.solitr.com/blog/2012/06/ember-input-field-with-save-button/