Может ли cleanNode() использоваться для очистки привязки?

С приведенным ниже кодом ввод # p_in будет обновлен с изменением ввода # s_in. Но я использовал cleanNode (сек). Может ли кто-нибудь помочь понять, почему привязка не очищена.

    <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>

Ответ 1

ko.cleanNode используется внутренним образом нокаутом для очистки данных/вычислений, которые он создал, связанных с элементом. Он не удаляет никаких обработчиков событий, добавленных связями, или обязательно понимает, изменилось ли привязка к DOM. Это может определенно вызвать проблемы, связанные с тем, что несколько обработчиков привязаны к элементу, когда он снова привязан снова.

Итак, я бы не рекомендовал использовать этот шаблон. Лучше всего использовать привязку with или template вокруг раздела и разрешить ее повторную визуализацию с помощью новых привязок.

Ответ 2

Надо признать, я немного смущен, так как работает для меня! Что вы видите, и что вы ожидаете увидеть точно?

Этот код будет показывать два входа с value p, что я и ожидал.