【问题标题】:Can cleanNode() be used to clean binding?cleanNode() 可以用来清理绑定吗?
【发布时间】:2013-02-10 09:49:17
【问题描述】:

使用下面的代码,input#p_in 将随着 input#s_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>

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    ko.cleanNode 被 Knockout 在内部用于清理它创建的与元素相关的数据/计算。它不会删除任何由绑定添加的事件处理程序,也不会理解绑定是否对 DOM 进行了更改。这肯定会导致问题,例如在随后再次绑定元素时将多个处理程序附加到该元素。

    所以,我不建议使用这种模式。更好的模式是在部分周围使用with 或template 绑定,并允许使用新绑定重新呈现它。

    【讨论】:

    • cleanNode 实际上是一个内部 API。目前没有专门的文档。
    • @RPNiemeyer 您能否详细说明“with”关键字如何解决此问题?我处于类似情况,并且打开/关闭了一个子模式窗口,我需要避免多次调用应用绑定..
    • 我发现的一个合法用例是在测试绑定或组件时。我的 afterEach 函数清除了包含绑定测试设置的元素,然后在其上运行 cleanNode 以使 KO 忘记它。然后我可以开始下一个 beforeEach,再次为测试设置绑定。这样我就有了完全封装的测试。
    • 和@SonicSoul 一样
    • 哇,这帮我解决了一个我已经奋斗了将近一天的问题...stackoverflow.com/q/40291746/782719
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2013-05-04
    • 2015-02-10
    • 2020-05-28
    • 2011-11-12
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多