5

バックボーンを学ぶためにImはTwitterのようなアプリを作成しています。つまり、TwitterはN秒ごとにサーバーにGETリクエストを送信して、新しいツイートをチェックします。新しいツイートがある場合は、非表示のli要素を作成し、「N個の新しいツイート」のボタンを表示します。クリックすると、非表示のli要素が表示され、新しいツイートが表示されます。ただし、新しいツイートを追加した場合の動作は異なります。ツイートは表示されます。ボタンをクリックして表示する必要はありません。

隠されたツイートのために、私はすでに最初の部分を作りました。新しいツイートを投稿してそれを直接表示する部分については、新しいモデルを作成し、collection.create()を呼び出して、次のような適切なイベントをトリガーすることで簡単にできると思いました。

var newTweet = new Tweet();
newTweet.set( /* set the attributes here. Some attributes are missing, because they are calculated server side */ );

var created_tweet = this.collection.create( newTweet, { silent: true, wait: true } ); // I choose silent=true because the add event on my collection is in charge of adding the new hidden tweets when there are new ones on the server
this.collection.trigger("posted_new_tweet", created_tweet);

次に、私のコレクションはイベント「posted_new_tweet」にサブスクライブされるため、ユーザーが新しいツイートを投稿するたびに、私のコレクションの特定のメソッドが呼び出されます。このアプローチは、トリガーで渡された変数created_commentが原因でエラーが発生するまでは正常に機能していました。これは、「完全」ではありません。つまり、モデルには、未定義の「id」や*「created_on」*などの属性がいくつかあります。これらの属性はサーバー側で計算されますが、wait = trueを渡すと、待機してサーバーからの応答でモデルが更新されると思いました(サーバーに対してPOSTリクエストが行われると、新しく作成されたモデルがjson)

私のモデルにはサーバー側の属性も含まれるべきではありませんか?それはそのようなことのための正しいアプローチですか?そうでない場合、コレクションビューを表示する2つの異なる方法をどのように設定できますか?

ありがとうございました!

4

1 に答える 1

14

createを渡しても非同期のままです{ wait: true }。違いはwait、モデルがない場合はコレクションにすぐに追加されるのに対し、waitバックボーンがある場合はサーバーからの成功応答までコレクションに追加されないことです。

あなたがすべきことはcreate、サーバーの応答時にイベントを発生させる成功コールバックを追加することです。

var created_tweet = this.collection.create( newTweet, { silent: true, wait: true, success: this.successCallback } );

// Add successCallback as a method to the collection
successCallback: function(collection, response) {
  // I'm not 100% positive which values are passed to this function. Collection may actually be the new model.
  this.collection.trigger("posted_new_tweet", created_tweet);
}
于 2012-04-06T18:33:08.987 に答える