ko.applyBindings上是否有某种回调可用?

时间:2015-08-25 14:16:06

标签: knockout.js

在我们当前的项目中使用,我们已经好几次来到这一点。

我怎样才能确保在网页上的所有绑定都被Knockout应用后,只有执行某些Javascript代码?

在我的特定用例中,我正在使用if - 绑定来评估一些配置选项,并决定是否应该呈现里面的元素(=在DOM中)。只有在评估了这些if - 绑定之后,我才需要计算某个元素中DOM节点的数量。显然,如果我过早计算if - 绑定尚未删除那些不需要的DOM节点,那么计数就会产生错误的结果。

2 个答案:

答案 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;
&#13;
&#13;