我正在将功能构建到用户可以多次执行的网页上.通过用户的操作,使用ko.applyBindings()创建对象/模型并将其应用于HTML.
数据绑定HTML是通过jQuery模板创建的.
到现在为止还挺好.
当我通过创建第二个对象/模型并调用ko.applyBindings()重复此步骤时,我遇到两个问题:
为了解决这个问题,在第一次传递之后,我调用jQuery的.empty()来删除包含所有数据绑定属性的模板化HTML,这样它就不再存在于DOM中了.当用户启动第二次传递的过程时,数据绑定的HTML将重新添加到DOM.
但就像我说的那样,当HTML重新添加到DOM并重新绑定到新的对象/模型时,它仍然包含来自第一个对象/模型的数据,我仍然得到不会发生的JS错误在第一次通过期间.
结论似乎是Knockout坚持这些绑定属性,即使从DOM中删除了标记.
所以我正在寻找的是从Knockout中删除这些绑定属性的方法; 告诉淘汰赛,不再有可观察的模型.有没有办法做到这一点?
编辑
基本过程是用户上传文件; 服务器然后用JSON对象响应,数据绑定的HTML被添加到DOM,然后JSON对象模型绑定到这个HTML使用
mn.AccountCreationModel = new AccountViewModel(jsonData.Account);
ko.applyBindings(mn.AccountCreationModel);
Run Code Online (Sandbox Code Playgroud)
一旦用户在模型上做了一些选择,就会将相同的对象发回服务器,从DOM中删除数据绑定的HTML,然后我有以下JS
mn.AccountCreationModel = null;
Run Code Online (Sandbox Code Playgroud)
当用户希望再次执行此操作时,重复所有这些步骤.
我担心代码太"参与"了jsFiddle演示.
我很确定我使用KO 2.0版本有内存泄漏.我有一个可观察的数组,其中填充了AJAX调用的结果.此集合是数据绑定的,每个集合都有一个DIV容器.数组中的每个对象都有一个绑定到复选框的可观察值.我已经使用Chrome检查了堆,我的结论如下:
如果AJAX调用返回3个元素,则它们在DOM上正确呈现.如果我此时拍摄堆的快照,那里有三个SearchResult对象.如果我再次触发AJAX调用并返回5个元素,则所有5个元素都正确呈现给DOM.但是,如果我在Chrome中拍摄堆的快照并对它们进行比较,则列出的8个元素仍在堆中,所有这些元素都被列为"已添加"而没有列为"已删除".DOM显示始终是正确的,但内存使用只是保持攀爬和攀爬,因为旧的搜索结果永远不会被释放.
任何人都可以帮助我或指出诊断内存泄漏的指针吗?
UPDATE
我已经创建了一个jsFiddle来展示我正在做的事情的要点.我已经把一切都划分了但核心功能,我仍然可以在我的本地机器上运行时复制内存泄漏.显然代码将无法发布,因为它需要命中我的本地服务器来运行搜索.
更新2
我推出了最新的2.1.0.0 Beta版本,泄漏消失了.我不是使用测试版的东西或经典的"只是升级到新版本"修复程序的忠实粉丝.我仍然非常有兴趣知道发生了什么改变或者我做错了什么造成了泄漏.