jQuery事件在"清理"之后没有触发淘汰赛绑定

时间:2015-06-23 17:16:05

标签: javascript jquery html button knockout.js

在我的项目中,我有一个<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()首先对按钮进行操作?

小提琴: http://jsfiddle.net/jL6L01xs/2/

1 个答案:

答案 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