2017-04-25 14 views
0

我正在重构一些现有代码以使用Knockout。有问题的代码是日历,并且是在用户页面通过前几个月或后几个月或几周动态构建的。多次应用绑定的正确方法

日历的工作方式是当用户按next或previous时,容器比渲染清除然后重建。

让Knockout工作很容易,只需要在单元格上应用正确的data-bind参数,然后调用ko.applyBindings即可。

我担心的是,因为代码破坏了Knockout绑定的DOM元素,所以它正在泄漏内存。这是否是这种情况,如果是这样,在清除包含绑定的容器之前日历应该做些什么?

+0

你有使用浏览器的[开发工具(https://developers.google.com/web/tools/chrome-devtools/memory-problems/)来检查你的假设?通常,如果您使用knockout来构建DOM,除非通过绑定处理程序,否则不应触摸它。使用'with','if','template'和'foreach'绑定动态添加*和*删除部分UI。 – user3297291

回答

0

通常,您不需要多次应用绑定。您创建一个模型,选择一个DOM节点,并对其应用绑定。如果在应用程序生命周期中某些模型发生变化,则这些变化会通过可观察或通知的模型属性反映在标记上。

但是,如果你注入淘汰赛组件到另一个应用程序,管理淘汰赛绑定已被应用到该节点,您可以从淘汰赛绑定清理节点:

var element = document.getElementById("MyNodeId"); 
ko.cleanNode(element); 
0

不要使用cleanNode函数来重新绑定一个模型 - 而不是使 模型成为可观察模型。

取自Jef Claes blog,我一直在使用这个概念来重新绑定模型,而不是使用cleanNode

示例代码

<div id="books"> 
    <ul data-bind="foreach: bookModel().booksImReading"> 
     <li data-bind="text: name"></li> 
    </ul> 
</div> 

var page = { 
    bookModel : ko.observable({ 
     booksImReading: [ 
      { name: "Effective Akka" }, 
      { name: "Node.js the Right Way" }] 
    }) 
}; 

ko.applyBindings(page, elementToBind); 

page.bookModel({ 
    booksImReading: [ 
     { name: "SQL Performance Explained" }, 
     { name: "Code Connected" }] 
}); 
相关问题