在我们当前的项目中使用knockout.js,我们已经好几次来到这一点。
我怎样才能确保在网页上的所有绑定都被Knockout应用后,只有执行某些Javascript代码?
在我的特定用例中,我正在使用if
- 绑定来评估一些配置选项,并决定是否应该呈现里面的元素(=在DOM中)。只有在评估了这些if
- 绑定之后,我才需要计算某个元素中DOM节点的数量。显然,如果我过早计算if
- 绑定尚未删除那些不需要的DOM节点,那么计数就会产生错误的结果。
答案 0 :(得分:7)
ko.applyBindings()
是synchronous call,所以下一个语句应该只在它完成后执行。如果您有淘汰组件,可以同步或异步加载它们。所以,例如
var vm = new ViewModel();
ko.applybindings(vm);
//
CountRenderedElements();
应该给你正确的结果。
答案 1 :(得分:4)
可能会有所帮助。您可以使用模板绑定来包装绑定(并将任何其他绑定放在模板中)并传递&after-afterRender'处理程序。在呈现内容之后将调用此处理程序。 我已经美化了上面提到的jsfiddle(在评论中):
var model = {
afterRenderCallback: function() {
// this method will be called after content rendered
var divContent = document.getElementById("textdiv").innerHTML;
alert(divContent);
},
txt: ko.observable("this text will be substituted in the div")
};
ko.applyBindings(model);

.content {
border: 1px solid red;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script type="text/html" id="wrappingTemplate">
<div id="textdiv" class="content" data-bind="text: txt"></div>
</script>
<!-- ko template: { name: 'wrappingTemplate', afterRender: afterRenderCallback } -->
<!-- /ko-->
&#13;