在我的项目中,我有一个<div>
,我专门应用我的Knockout.js绑定。我必须根据用户点击的内容在该区域中实例化不同的视图模型。
为了防止无法在同一个元素错误上调用绑定两次,我首先必须&#34;清理&#34;绑定使区域再次可用。我调用了最初的applyBindings()
函数:
ko.applyBindings(new ViewModel("Planet", "Earth"), document.getElementById("bindings-area"));
最终,我将清除<div>
并调用新绑定:
var element = $("#bindings-area")[0];
ko.cleanNode(element);
ko.applyBindings(new ViewModel("NEW", "Bindings"), document.getElementById("bindings-area"));
问题:当我在#bindings-area
div中包含HTML按钮时,在清除绑定并实例化新模型后,它将不再有效。我确定它与ko.cleanNode()
函数有关,以某种方式删除了按钮绑定。如何重新启动它们或阻止cleanNode()
首先对按钮进行操作?
答案 0 :(得分:2)
Knockout documentation中很好地描述了这个问题。这句话描述了问题是什么以及需要做些什么:
删除元素时,Knockout会运行逻辑来清理任何数据 与元素相关联。作为这种逻辑的一部分,Knockout称之为 jQuery的
ko.utils.domNodeDisposal.cleanExternalData(node)
方法,如果你的页面加载了jQuery。在 高级方案,您可能希望阻止或自定义此数据的方式 已在您的申请中删除。 Knockout暴露了一个功能,cleanData
,可以 重写以支持自定义逻辑。例如,要阻止cleanExternalData
从被调用,可以使用空函数来替换 标准ko.utils.domNodeDisposal.cleanExternalData = function () { // Do nothing. Now any jQuery data associated with elements will // not be cleaned up when the elements are removed from the DOM. };
实施:{{1}}
以下是更新后的jsFiddle。