17

以下のコードでは、input#s_in の変更により、input#p_in が更新されます。しかし、私は cleanNode(sec) を使用しました。バインディングがクリアされない理由を理解できる人はいますか。

    <input id="p_in" data-bind="value: name"></input>
    <input id="s_in" data-bind="value: name"></input>
    <input id="cb" type="checkbox">same</input>

    <script type="text/javascript">
        function AddrDataSet (name) {
            this.name = ko.observable(name);
        };

        var primary_set = new AddrDataSet('p');
        var sec_set = new AddrDataSet('s');
        var pri = $('#p_in')[0];
        var sec = $('#s_in')[0];

        ko.applyBindings(primary_set, pri);
        ko.applyBindings(sec_set, sec);

        ko.cleanNode(sec); // clean it
        ko.applyBindings(primary_set, sec); // bind it to primary_set
        ko.cleanNode(sec); // clean it again

    </script>
4

1 に答える 1

31

ko.cleanNode要素に関連して作成されたデータ/計算結果をクリーンアップするために、Knockout によって内部的に使用されます。バインディングによって追加されたイベント ハンドラーを削除したり、バインディングが DOM に変更を加えたかどうかを必ずしも理解したりすることはありません。これにより、後で再度バインドされたときに、要素に複数のハンドラーがアタッチされるなどの問題が確実に発生する可能性があります。

したがって、このパターンを使用することはお勧めしません。より良いパターンは、セクションwithの周りに またはtemplateバインディングを使用し、新しいバインディングで再レンダリングできるようにすることです。

于 2013-02-25T14:40:09.393 に答える