1

我有以下设置:

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

我有一个具有父子关系的 KOJS 视图模型。使这种关系有点奇怪的是,孩子需要父母才能执行其中一个计算功能。

这给我带来了各种各样的问题,因为当我调用保存时,我必须重新加载我所有的孩子,每当父母的 observable 发生变化时,老孩子仍然会触发他们的计算函数。

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

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

4

2 回答 2

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);​

请注意“活动”标志是如何用于有条件地离开计算函数的。对我来说,这只是解决我遇到的基本问题的技巧。

于 2012-09-26T19:48:40.667 回答
0

您可以使用 ko 函数:ko.removeNode(node)它调用ko.cleanNode(node)然后从父节点中删除子节点。

于 2012-09-26T13:29:07.850 回答