2012-04-06 62 views
5

要學習骨幹我創建一個類似Twitter的應用程序。所以你知道Twitter每N秒發送一次GET請求到服務器來檢查新的推文。如果有新的推文,它會創建隱藏的元素,並顯示帶有「N new Tweets」的按鈕。如果您點擊它,它會顯示隱藏的元素,顯示新的推文。 但是,添加新推文時,行爲會有所不同:推文是可見的。您不必點擊按鈕即可看到它。骨幹collection.create()不返回更新的模型

我已經爲隱藏的推文做了第一部分。對於發佈新的鳴叫,並將其顯示照片直接的部分,我認爲這將是很容易通過創建一個新的模式,調用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 POST請求是對服務器,它返回在json中創建新模型)

我的模型不應該具有服務器端屬性嗎?這樣的事情是否正確?如果不是,我怎麼能有兩種不同的方法來顯示集合視圖?

謝謝!

回答

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); 
} 
+0

這是正確的:)謝謝! – fiunchinho 2012-04-06 19:12:27

+0

我相信在Backbone的後期版本中,參數現在是'nextModel'和'response'。 – IanS 2016-09-02 14:21:09