我的淘汰赛应用程序中有observableArray
,如下所示:
self.Parents = ko.observableArray([
{
Father: 'Father-A',
Mother: 'Mother-A',
Children: ko.observableArray([
{Name: 'Child-A1'},
{Name: 'Child-A2'},
{Name: 'Child-A3'}])
},
{
Father: 'Father-B',
Mother: 'Mother-B',
Children: ko.observableArray([
{Name: 'Child-B1'},
{Name: 'Child-B2'},
{Name: 'Child-B3'}])
}]);
我在computed observable
变量上有Parents
,如下所示:
ko.computed(function(){
alert('Record Updated');
console.log(self.Parents());
});
现在,当我向任何父项添加/删除子项时,我相信应该调用上面的计算函数,因为当我添加/删除子项时,父变量会间接地更新。但它没有用。作为小提琴的解决方案,应显示Record Updated
警报。
那我怎么能做到这一点?
注意:请注意,这只是我创建的一个示例。在实际场景中,Parents对象被传递给第三方网格库。如果父/子中发生任何更改,则应更新网格。这就是我在
编写self.Parents()
而不是computed function
Children
的原因
答案 0 :(得分:1)
您可以使用ko.toJs
为对象中的每个observable创建依赖项。
ko.computed(function() {
alert("Children Array changed");
return ko.toJS(self.Parents());
});
您可以在computed
属性中执行操作。但是computed
属性中的逻辑似乎是错误的,因此您创建了对该computedToJS
属性的订阅:
self.isDirty = ko.observable(false);
self.computedToJS = ko.computed(function() {
return ko.toJS(self.Parents());
});
self.computedToJS.subscribe(function(value){
self.isDirty(true);
// Do all your stuff here.
});
请注意,这会被所有observables
触发。如果您要将Father
属性更改为observable
并更新属性,则会再次触发计算。
您可以使用ko.toJS
或者,您可以创建ParentViewModel
并向subscribe
Children
which is available from Knockout 3.0+添加observableArray
。您可以通过this question获取示例。
答案 1 :(得分:0)
我已经解决了我的问题。
删除子行后,下面的代码行将通知父母子数据已被更改:
self.Parents.valueHasMutated()