当孩子被移除时,Knockout Observable Parent

时间:2017-10-18 09:51:27

标签: knockout.js

我的淘汰赛应用程序中有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警报。

  

Fiddle - Code Snippet

那我怎么能做到这一点?

  

注意:请注意,这只是我创建的一个示例。在实际场景中,Parents对象被传递给第三方网格库。如果父/子中发生任何更改,则应更新网格。这就是我在self.Parents()而不是computed function

编写Children的原因

2 个答案:

答案 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并更新属性,则会再次触发计算。

Here's an updated fiddle

您可以使用ko.toJS

在淘汰赛中创建脏标志this blog post

或者,您可以创建ParentViewModel并向subscribe Children which is available from Knockout 3.0+添加observableArray。您可以通过this question获取示例。

答案 1 :(得分:0)

我已经解决了我的问题。

删除子行后,下面的代码行将通知父母子数据已被更改:

self.Parents.valueHasMutated()