我有我的視圖模型的財產observableArray:如何刪除淘汰賽驗證validatedObservable從可觀察到的陣列
self.rates = ko.observableArray([])
數組的內容顯示在一個HTML表格。有一個按鈕可以將項目添加到數組中。這些是驗證的觀察值:
self.newRate = function() {
var rate = new Rate({id: self.id});
rate.isEditing(true);
rate.isNew = true;
rate = ko.validatedObservable(rate);
self.vendor().rates.push(rate);
};
這工作正常。該項目被添加到陣列和視圖更新。新增項目旁邊的取消鏈接可讓用戶移除該行。
self.editRateCancel = function (item) {
if (item.isNew === true) {
self.vendor().rates.remove(item);
} else {
item.cancelEdit();
ko.utils.arrayForEach(self.unitsOfMeasure(), function (uom) {
if(item.cacheUnitOfMeasureID === uom.value) {
item.selectedUOM(uom);
}
});
}
};
對remove(item)
的調用不會刪除該項目。如果我不將該項設置爲驗證的可觀察項,則刪除成功。查看remove
函數,顯示正在傳入的項目(valueOrPredicate)類型爲Object, (Rate)
,但從基礎數組返回的值爲Object, (Function)
,因此predicate(value)
返回false,因此該項目不會被刪除。
KnockoutJS刪除功能:
ko.observableArray['fn'] = {
'remove': function (valueOrPredicate) {
var underlyingArray = this.peek();
var removedValues = [];
var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
for (var i = 0; i < underlyingArray.length; i++) {
var value = underlyingArray[i];
if (predicate(value)) {
if (removedValues.length === 0) {
this.valueWillMutate();
}
removedValues.push(value);
underlyingArray.splice(i, 1);
i--;
}
}
if (removedValues.length) {
this.valueHasMutated();
}
return removedValues;
},
如何從可觀察到的數組中刪除特定的驗證觀測?是否有任何實用功能可用?
我沒有意識到一個函數可以像第三種方法中描述的那樣傳遞給remove方法。這很好,因爲它使代碼簡短。我最終編寫了基於KnockOutJS代碼的自己的刪除函數,但我認爲我更喜歡你的代碼。謝謝您的幫助。 – DaveB
很高興我可以幫助:)我實際上不知道我能做到這一點,直到我看到你發佈的問題和代碼,並提出這個想法。所以也要感謝你! –