2016-06-09 37 views
1

在KnockoutJS中,您可以擁有屬於對象數組的屬性。例如。在KnockoutJS中銷燬元素後獲取屬性的長度

self.items可以由項目:

var item = function (data){ 
    //mapping here 
} 

然後你可以「消滅」這些對象之一,通過調用類似:

self.items.destroy(item); 

不過,如果我檢查/綁定到self.items的長度,它仍然是全長(包括被破壞的物體)。例如,這將不會得到正確的東西摧毀後更新,並保持明顯的:

data-bind="visible: myData.items().length > 0" 

如何獲得的長度,減去損壞的對象?

我想我可以創造一個computed kojsLength方法,並把它添加到每一個對象,即循環陣列上方,並計算沒有_destroy財產的所有項目?

但是有沒有內置的KOJS解決方案,還是我必須這樣做?

編輯,我的解決方案:

對於我來說,因爲我有沒有用在後端的_destroy財產,在remove功能直接替代destroy完美的作品。

+0

您使用的鐵軌在後臺?爲什麼不使用'remove'(例如'self.items.remove(item)')而不是'destroy'? – nemesv

+0

沒有不使用鐵軌,我想也許我可以使用刪除實際上,會給它一個 – Andrew

+0

是的,因爲我沒有使用後端的_destroy屬性,直接替換「刪除」工程就像一個魅力.. 。 謝謝。 – Andrew

回答

1

這是因爲被銷燬的元素實際上並未從底層數組中移除。正如您通過運行下面的代碼片段所看到的那樣,它們只被標記爲已銷燬。

沒有內置的KO解決方案。

如果你想通過計算長度排斥他們,你需要一個自定義的長度函數,它丟棄它們:

function viewModel(name) { 
 
    this.name = name; 
 
} 
 

 

 
var array = ko.observableArray([new viewModel("a"), new viewModel("b")]); 
 

 
console.log(array().length); 
 

 
array.destroy(array()[0]); 
 
console.log(array().length); 
 
console.log(JSON.stringify(array())); 
 

 

 
function lengthOfAlive(obs) { 
 
    var before = obs().length; 
 
    var res = before; 
 
    for (var i = 0; i < before; ++i) { 
 
    if (obs()[i]._destroy) 
 
     res--; 
 
    } 
 
    return res; 
 
} 
 

 
console.log(lengthOfAlive(array));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>