1

私は次の設定をしています:

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

親子関係を持つKOJSビューモデルがあります。この関係を少し奇妙にしているのは、計算された関数の 1 つを実行するために、子が親を必要とすることです。

保存を呼び出し、すべての子をリロードする必要がある場合、親のオブザーバブルが変更されるたびに、古い子がまだ計算された関数を起動しているため、これは私にとってあらゆる種類の問題を引き起こします。

これは私が目指している動作ではありません。私がやりたいことは、保存する前にすべての子を完全に削除してから、サーバーのコールバックから子を追加し直すことです。これが意味することは、年老いた子供たちは記憶から完全に消え去り、もはやイベントを起動しないということです。しかし、実際に 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);​

計算された関数を条件付きで終了するために「alive」フラグがどのように使用されているかに注目してください。私にとって、これは私が抱えている根本的な問題を解決するための単なるハックです。

于 2012-09-26T19:48:40.667 に答える
0

ko 関数を使用できます。これは、親ノードから子ko.removeNode(node)を呼び出して削除します。ko.cleanNode(node)

于 2012-09-26T13:29:07.850 に答える