我正在处理一些我没有编写的有趣的代码,并且遇到了一个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>