2015-09-06 78 views
1

我有一個名爲emails的observableArray內的對象數組。陣列中的每個電子郵件都有一個關聯複選框,可以一次選擇多個郵件。爲了適用於多件物品的功能,看我環路通過電子郵件,如果他們檢查,如果他們是它們運行的​​功能:如何用淘汰賽在循環中刪除一段observableArray?

self.deleteSelected = function() { 
    for (var i = 0; i < self.emails().length; i++) { 
     if (self.emails()[i].selected() == true) { 
      ** what would go here ** 
     } 
    } 
} 

迴路我有工作正是我想要的因爲我有它與其他函數一起使用,但我似乎無法得到正確的函數從observableArray刪除索引。如果嘗試.remove().splice但我無法讓他們中的任何一個人工作。

任何想法,我需要添加到該函數來讓它刪除數組中相應的索引,因爲它循環?

回答

1

我想你會遇到問題,從你正在遍歷的數組中刪除元素。作爲一種替代方法,爲什麼不用你想要保留的物品建立一個新的陣列呢?

沿着這些線路的東西應該工作:

self.deleteSelected = function() { 

    var emails = self.emails(), 
     emailsLength = emails.length, 
     emailsToKeep = []; 

    for (var i = 0; i < emailsLength; i++) { 
     if (emails[i].selected() !== true) { 
      emailsToKeep.push(emails[i]); 
     } 
    } 

    self.emails(emailsToKeep); 
} 

順便提一下,更換你的observableArray在一個單一的操作它也從一個表演好點:每次你會使用splice()remove()您會導致關聯的一塊DOM完全重建,這種方式只發生一次。

注意,在我的代碼有兩個其他小的性能改進:

  • 我在變量緩存每個

  • 我存儲在一個變量數組length而不是時間取回他們的觀測,而不是在每個循環中訪問屬性。

+0

真棒,這個工程,我喜歡的改進。謝謝你的解釋,我想知道爲什麼! –

+0

謝謝,如果你喜歡答案/你發現它有用,你可以upvote /接受它。 –