3

我的问题很简单。下面的代码,它似乎工作得很好(点击这里查看一个工作小提琴),实际上是对 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); 

这种方法的好处是,您可以在实际将其添加到 DOM之前将所有绑定应用到 HTML ,因此您不会在绑定生效前短暂看到空 HTML 的情况下获得这种效果。有什么理由不这样做?

4

1 回答 1

3

Knockout 中有与绑定中使用的计算 observables 相关的处置逻辑,当它认为元素不再是 DOM 的一部分时将运行。在您的情况下,您可能会无意中遇到此逻辑,并且可能会释放绑定。

这是一个示例,您将一个元素绑定到一个可观察对象,然后该可观察对象将作为元素value绑定的一部分进行更新selecthttp://jsfiddle.net/rniemeyer/X8RVP/4/

经过一些进一步的研究,我认为您的技术不一定会在每种情况下都会失败,但我会意识到我上面列出的事情。

您可以选择在应用绑定时隐藏元素,或对主要部分使用命名模板(在脚本标签中),以便元素在绑定之前不显示。

命名模板有助于您永远不会看到您的“模板”像使用控制流绑定 ​​( if, with, foreach) 或什至只是带有绑定的普通元素一样呈现。它不一定能阻止您试图阻止的问题,但它肯定会有所帮助,因为绑定将在元素添加到 DOM 时立即发生。考虑使用命名模板的这个:http: //jsfiddle.net/rniemeyer/X8RVP/5/与没有http://jsfiddle.net/rniemeyer/X8RVP/6/的这个。在 setTimeout 中应用绑定以模拟页面加载和 DOM 准备就绪的一些延迟。

于 2012-07-12T21:14:49.167 回答