2012-11-01 71 views
0

當我使用Backbone集合的each方法時,我目前正在經歷非常不尋常的行爲。在我的應用程序中,我允許用戶編輯現有模型,其中包括編輯並向該模型添加一些時間限制。該模型及其時間約束與Backbone Relational關聯。每次用戶點擊添加一個新的時間約束,我都會在關係中添加一個TimeConstraint模型而不保存它。如果用戶決定取消編輯,則應從關係中刪除所有新/未保存的TimeConstraints。但是,當我循環播放集合時,它似乎沒有執行最後的迭代。Backbone.Collection.each - 非常奇怪的行爲

我構建了一個的jsfiddle說明這種情況在這裏:http://jsfiddle.net/richardstokes/ZzFgZ/9/

遵循的步驟如下:

  1. 點擊「編輯政策」
  2. 使用「新加入2​​種或多個新的時間限制時間約束」按鈕
  3. 通過單擊取消編輯‘取消修改’

您會注意到控制檯打印出time_constraints集合的開始長度和整理長度,以及刪除未保存模型後的中間長度。它似乎總是停下來並在集合中留下一個項目,即使它們都是新的/未保存的。

如果有人能夠幫助我解決這個問題,我將不勝感激,這讓我堅持了一整天。

回答

1

由於正在迭代timeConstraints的集合,您正在刪除項目,這可能會導致未定義的行爲。先嚐試讓新timeConstraints列表,然後將它們作爲一個數組刪除():

var toRemove = this.model.get('time_constraints').filter(function (timeConstraint) { 
    return timeConstraint.isNew(); 
}); 
this.model.get('time_constraints').remove(toRemove); 
+0

正如感興趣的事,爲什麼要刪除的項目作爲集合被迭代是造成這種不確定的行爲?當然,如果迭代結束時集合的長度仍然大於零,迭代應該繼續?只是想更充分地理解問題。 –

+0

我沒有具體的答案。根據文檔,forEach實現遍歷在forEach調用開始時出現的元素(請參閱https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach )和下劃線源代碼。 mozilla doc確實說明在迭代時改變數組的內容意味着可能不會訪問某些元素。一般來說,這不是一件安全的事情(而.NET等一些語言會主動引發錯誤)。 – Yossarian21

+0

好的謝謝你的洞察力。你的解決方案對我來說非常合適將來會更小心不要這樣做。 –