如果试图替换可观察数组中某个对象的特定属性,它将不起作用,因为这些属性本身是不可观察的。
您有两个选择:
-
使每个可以更新的对象的每个属性都是可观察的。如果选择此选项,请阅读
this question
.
-
替换整个对象本身。
你提到替换不起作用。你是这样做的吗?
var viewModel = function(){
var self = this;
//demo
var itemIndex = {
id:1
}
self.displayProductData = ko.observableArray([
{id: 0, description: 'desc 1'},
{id: 1, description: 'desc 2'}
]);
self.replaceObject = function(data, event){
var oldObject = self.displayProductData().find(function(arrayObject){
return data.id === arrayObject.id;
});
var newObject = Object.assign({}, oldObject);
newObject.description = "replace method desc";
self.displayProductData.replace(oldObject, newObject);
};
self.replaceObjectWithSplice = function(data, event){
var oldObject = self.displayProductData().find(function(arrayObject){
return data.id === arrayObject.id;
});
var newObject = Object.assign({}, oldObject);
newObject.description = "splice desc";
self.displayProductData.splice(data.id, 1, newObject);
};
};
ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<ul data-bind="foreach: displayProductData">
<li>
<span data-bind="text: id"></span>,
<span data-bind="text: description"></span>
<button data-bind="click: $parent.replaceObject">Replace</button>
<button data-bind="click: $parent.replaceObjectWithSplice">Splice</button>
</li>
</ul>
注意:如果要替换大量数据,我的答案不是最有效的方法—每次创建新对象都需要额外的内存。
编辑:
根据评论,我把按钮移到了
foreach
循环以显示当您从Knockout对象中调用函数时(在本例中
displayProductData
event
.