4

ユーザーが 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);
}

サーバーが処理できるように 1 秒間一時停止してから、Twitter からの応答で Post オブジェクトをリロードしようとしていることがわかります。これらの最後の数行は、この新しいコードが入ると思われる場所ですが、戻ってこないかもしれない何かを聞く方法がわかりません. 1 秒間「待つ」のではなく、メッセージが更新されるだけでよかったと思います。しかし、それを達成する方法がわかりません。

考え?

4

2 に答える 2

3

レコードが作成された後、コードをコールバックとして実行する必要があります。こうやって:

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

これにより、レコードが作成されたときにレコードに 1 回限りの通話が追加されます。「didUpdate」および「didDelete」フックもあります。create が呼び出される前に、これらのコールバックを追加する必要があります (明らかに)。

まだ調べていないので、エラー状態を処理する方法がわかりません。

編集: https://github.com/emberjs/data/issues/405に従って、これは実際には壊れているため、現在のところ待機が唯一のオプションである可能性があります。

于 2013-03-13T20:21:10.997 に答える