KnockoutJS:没有参数调用applyBindings有什么作用?

时间:2016-06-11 02:39:57

标签: javascript knockout.js magento2

我正在编写一些我没有写过的有趣代码,并且遇到了似乎为应用程序初始化KnockoutJS实例的RequireJS模块。

define([
    'ko',
    './template/engine',
    'knockoutjs/knockout-repeat',
    'knockoutjs/knockout-fast-foreach',
    'knockoutjs/knockout-es5',
    './bind/scope',
    './bind/staticChecked',
    './bind/datepicker',
    './bind/outer_click',
    './bind/keyboard',
    './bind/optgroup',
    './bind/fadeVisible',
    './bind/mage-init',
    './bind/after-render',
    './bind/i18n',
    './bind/collapsible',
    './bind/autoselect',
    './extender/observable_array',
    './extender/bound-nodes'
], function (ko, templateEngine) {
    'use strict';

    ko.setTemplateEngine(templateEngine);
    ko.applyBindings();
});

此代码在没有视图模型的情况下调用ko.applyBindings() 。我是淘汰赛的新手,但所有我已经看过的教程表明你需要传递applyBindings一个viewModel对象。

在没有参数的情况下调用applyBindings会怎样呢?

我的最终目标是弄清楚这个应用程序(Magento 2,如果有人好奇的话)是如何使用Knockout来渲染的,所以我正在寻找Knockout开发人员可能会做这样的事情的原因。

2 个答案:

答案 0 :(得分:1)

如果没有视图模型,大多数淘汰赛的功能都没有意义,但这并不是必需的。您可以在the source中看到,当您未传递viewmodel参数时,没有任何内容:它只是将绑定上下文设置为undefined

function getBindingContext(viewModelOrBindingContext) {
    return viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext)
        ? viewModelOrBindingContext
        : new ko.bindingContext(viewModelOrBindingContext);
}

我可以想到一些例子,为什么没有视图模型的人会applyBindings

  • 注入静态模板
  • 附加全局上下文中的事件侦听器方法

我必须承认,虽然这些感觉有点做作......我实际上不知道为什么你所展示的代码就是这样......

window.logClick = function(data, event) {
  console.log("Click");
};

ko.applyBindings();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div>
  <div data-bind="template: 'header-template'"></div>

  <button data-bind="click: logClick">click listener in window</button>
</div>



<script id="header-template" type="text/html">

  <h1>A header inserted by template</h2>
  
</script>

答案 1 :(得分:1)

通过这里的一些评论和其他研究,我能够找到我想要的答案。

我的错误是认为ko.applyBindings()主要工作是将视图模型(javascript对象)与视图(HTML页面)相关联。虽然applyBindings&#39;的一个作业,applyBindings 开始呈现视图(HTML页面)。在Knockout的世界中,渲染视图意味着(至少?)扫描HTML页面以查找data-bind属性,并处理这些属性。

单独处理没有数据的data-bind属性非常有用。但是,如果您使用的应用已创建自定义绑定(如this tutorial中所示),则调用applyBindings可以执行的操作没有限制。在我的特定情况下,Magento 2有一个名为scope的自定义绑定(通过一些其他机制)将绑定特定节点上下文的数据。