Knockout.js绑定在Ajax驱动的页面上

spi*_*cer 6 memory-leaks resource-cleanup knockout.js

真的开始享受KnockoutJs(http://knockoutjs.com).我的大多数网络应用都是ajax驱动的.加载整个站点,然后从链接到链接我们只需通过ajax调用更改正文内容.

当ajax返回新的body内容时,我可以执行我的Knockout绑定.没问题.当我链接到下一页(只是一个更换身体的ajax调用).我认为Knockout建筑物仍然在记忆中,但由于dom已经改变,因此并没有真正受到限制.关于这个主题的一些问题.

  1. 如果下一页上没有任何Knockout,那么将淘汰对象留在内存中的那种真的很糟糕吗?更好的是有没有办法重置(清除)淘汰对象?

  2. 当我从一个具有敲除绑定的页面转到另一个具有敲除绑定的页面时,只是调用ko.applyBindings()再次清除旧的东西并重新绑定新的东西?(再一次,当我说从一个页面转到另一个页面时,我只是用ajax调用重新加载身体).

  3. 淘汰赛是否有任何"实时"绑定.有点像jQuery的实时绑定?这样就可以预先加载Knockout,然后不必将内容更改重新应用到内容更改.

一般情况下,我正在寻找关于如何在一个应用程序中从页面到页面最佳使用淘汰的建议,其中浏览器不会在页面之间刷新.

在此先感谢您的帮助.

Jim*_* G. 1

1) 如果下一页上没有任何 Knockout,那么将淘汰对象留在内存中真的那么糟糕吗?更好的是有没有办法重置(清除)淘汰对象?

不,没那么糟糕;但如果你真的想清理的话你可以打电话ko.removeNode


2)当我从一个具有淘汰绑定的页面转到另一个具有淘汰绑定的页面时,是否只需再次调用 ko.applyBindings() 清除旧内容并重新绑定新内容?(再次,当我说从一个页面到另一个页面时,我只是通过 ajax 调用重新加载正文)。

这取决于。

首先,正如GregT 提到的

不应applyBindings()在同一个 DOM 节点上调用多次。

我从经验中知道 -ko.applyBindings()在同一个 DOM 节点上调用多次会导致内存泄漏。[如果您需要这样做,请致电ko.cleanNode()。]

OTOH,如果你没有ko.applyBindings()在同一个 DOM 节点上调用多次,那么你应该没问题,因为

KO 在添加/删除节点时会做一些清理工作。发生这种情况的典型时间是重新渲染模板时。


3) 淘汰赛是否有任何“实时”绑定。有点像 jQuery 的实时绑定?这样,Knockout 可以预先加载,然后不必在内容更改之间重新应用。

据我所知,但如果我正确理解您的问题,您不应该需要任何本机 Knockout 功能来实现您需要的功能。您应该能够使用 jQuery 的on()方法自行连接它(因为live()已被弃用)。