我的问题非常简单。以下代码看起来效果不错(单击here查看工作小提琴),实际上是ko.applyBindings的有效使用还是可能出现副作用和/或问题?
var viewModel = {
sampleText: ko.observable('hello world!')
};
// this HTML would be loaded from the server
var htmlWithBindings = '<b data-bind="text: sampleText"></b>';
var jQueryObj = $(htmlWithBindings);
ko.applyBindings(viewModel, jQueryObj.get(0));
$('#main').append(jQueryObj);
这种方法的好处是你可以将所有绑定应用到HTML 之前实际将它添加到DOM中,所以当你看到空的HTML时,你不会得到那种效果在绑定生效之前的短暂时间。有什么理由不这样做吗?
答案 0 :(得分:3)
Knockout中存在与绑定中使用的计算的observable相关的处理逻辑,当它认为元素不再是DOM的一部分时将运行。在您的情况下,您可能会无意中触及此逻辑并且可能会处置绑定。
以下是将元素绑定到observable的示例,然后将该observable更新为value
元素上select
绑定的一部分。 http://jsfiddle.net/rniemeyer/X8RVP/4/
经过一些进一步的研究,我不认为你的技术在每种情况下都不会失败,但我会注意到上面列出的事情。
您可以选择在应用绑定时隐藏元素,或者对主要部分使用命名模板(在脚本标记中),以便元素在绑定之前不会显示。
命名模板有助于您永远不会看到使用控制流绑定(if
,with
,foreach
)甚至可能使用的“模板”呈现只是带有绑定的普通元素。它并不一定能阻止您试图阻止的问题,但它肯定会有所帮助,因为绑定将在元素添加到DOM时正确发生。考虑这个带有命名模板的模板:http://jsfiddle.net/rniemeyer/X8RVP/5/与没有http://jsfiddle.net/rniemeyer/X8RVP/6/的模板。绑定应用于setTimeout以模拟页面加载和DOM准备就绪的一些延迟。