我有observableArray
observable properties
。我想在添加项目/项目的任何属性更改时设置observableArray项目的状态。
function ViewModel() {
this.myArray=ko.observableArray([]);
}
var viewModel = new ViewModel();
$(function(){
ko.applyBindings(viewModel);
viewModel.myArray.push({Value1:ko.observable("Test"),Value2:ko.observable("Test1"),Status:ko.observable('Added')});
});
每当observableArray
项目被修改(From UI or from Code)
时,我想fire change event
使用该项目。
例如:从代码修改
viewModel.myArray()[0].Value1("newTest1"); // At this point i need change event with changed array item.
请建议我如何实现这一目标。我们将不胜感激。
答案 0 :(得分:0)
您可以使用某些(私有)计算字段,您将迭代所需的所有可观察属性。 如果稍后会对此计算内的某些内容进行更改,则会重新计算该内容,您将收到通知
ko.computed(function(){
viewModel.collection().forEach(function(element){
var a = element.text();
});
}
在此示例中,当更改数组或更改任何元素文本时,将重新计算整个计算,并且您可以在此处设置一些所需的状态
答案 1 :(得分:0)
如上面的评论中所述,您需要订阅observable
而不是尝试订阅observableArray(因为只有在添加/删除某些内容时才会收到通知)。
<强>视图模型:强>
function child(data) {
var self = this;
self.Value1 = ko.observable(data.Value1);
self.Value2 = ko.observable(data.Value2);
self.Status = ko.observable(data.Status);
ko.computed(function () {
self.Value1();
self.Value2(); // subscribing multiple observables
if (!ko.computedContext.isInitial()) { //status remains intact initially(onLoad)
self.Status('Modified');
}
});
}
function ViewModel() {
var self = this;
self.myArray = ko.observableArray([]);
}
$(function () {
ko.applyBindings(new ViewModel());
});
工作样本 here
您可以在上面找到我正在使用功能computedContext
isInitial
isInitial() - 在第一个函数中调用时返回true的函数 曾经评估当前计算的可观察量,或者是假的 除此以外。对于纯计算的observable,isInitial()始终是 未定义。
计算文档here