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

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开发人员可能会做这样的事情的原因。

最佳答案

如果没有视图模型,大多数敲除功能将无济于事,但这并不是必需的。您可以在the source中看到,如果不传递viewmodel参数,则什么都不会中断:它只是将绑定上下文设置为undefined

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


我可以想到几个示例,为什么没有viewmodel的情况下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>

07-25 20:46