【发布时间】:2015-09-11 08:08:57
【问题描述】:
我正在使用 KnockoutJS,但我注意到绑定存在问题,我可以使用此示例进行解释:
<label><input type="checkbox" data-bind="checked: displayMessage" /> Display message</label>
<div data-bind="if: displayMessage">Here is a message.<span id="super">SUPER</span> Astonishing.</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
$(function(){
ko.applyBindings({
displayMessage: ko.observable(true)
});
$('#super').on("click", function(){
alert('SUUUUUPER');
});
});
当您第一次单击“SUPER”span 元素时,会显示警报。但是,如果您通过将模型的属性 displayMessage 设置为 false 并将其放回 true 以再次显示它来删除块,则与单击事件的绑定将不再起作用。
从if、ifnot 和with bindingHandlers 的源代码中我知道,knockout 会在第一次删除 DOM 克隆并保存它并使用虚拟元素 API 重新附加它。
所以我的问题是:知道 jQuery on() 实用程序会将事件处理程序附加到选定元素,即使它们尚不存在。是使用导致点击绑定丢失的虚拟元素。如果不是:向我解释会发生什么。
【问题讨论】:
标签: javascript jquery knockout.js jquery-events