2012-09-26 94 views
1

我有以下设置:如何在Knockout JS中完全从视图模型中删除子对象?

http://jsfiddle.net/josephbulger/FjmAU/

我有有父母与子女关系的KOJS视图模型。是什么让这种关系有点奇怪,是因为孩子需要父母才能执行它的一个计算函数。

这对我造成各种各样的问题,因为当我调用保存时,我必须重新加载所有的孩子,当父母的可观察性发生变化时,旧的孩子仍然会触发他们的计算函数。

这不是我要去做的行为。我想要做的是在保存之前完全删除所有的孩子,然后从服务器回调中添加孩子。我的意思是,这些老孩子会完全从记忆中消失,他们不会再发生任何事件。但是,我不知道如何用KOJS正确清理它们。在这一点上,我知道如何正确做的唯一的事情就是将它们从父母的子女名单中删除。

在KOJS视图模型中完全处理子对象的正确方法是什么?

回答

0

您可以使用ko功能:ko.removeNode(node),它调用ko.cleanNode(node),然后从父节点中删除该子项。

+0

不幸的是,这并不适合我。 (http://jsfiddle.net/josephbulger/FjmAU/14/) – Joseph

+0

我认为你应该删除'self.children()[i] .parent = null;'line:http://jsfiddle.net/FjmAU/ 15 / – mhu

0

作为一种变通方法,我不得不求助于这样做,但我真的不希望这是解决方案:

function Parent() { 
    var self = this; 

    self.children = ko.observableArray([]); 

    self.troublemaker = ko.observable(5);  

    self.blowaway = function() { 

     //i have to do this so i can serialize later 
     for (var i = 0; i < self.children().length; i++) {  
      self.children()[i].alive = false;       
      self.children()[i].parent = null; 
     } 

     var dataToServer = ko.toJSON(self); 

     //save to server 

     self.children.removeAll(); 

     makeChildren(); 

    } 

    function makeChildren(){ 
     self.children.push(new Child(self));  
     self.children.push(new Child(self));  
     self.children.push(new Child(self));       
    }  

    makeChildren(); 

} 

var count = 0; 

function Child(parent) { 

    var self = this; 

    self.parent = parent; 

    self.alive = true; 

    self.something = ko.observable(10 * count); 

    count++; 

    self.iwillblowup = ko.computed(function() {  
     if (!self.alive) 
      return; 
     return self.something() * self.parent.troublemaker(); 
    });   
} 

var viewModel = new Parent(); 
ko.applyBindings(viewModel);​ 

注意如何“活”标志被用于有条件离开计算的功能。对我来说,这只是解决我所遇到的基本问题的一种手段。