我正在编写一些我没有写过的有趣代码,并且遇到了似乎为应用程序初始化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开发人员可能会做这样的事情的原因。
答案 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
的自定义绑定(通过一些其他机制)将绑定特定节点上下文的数据。