玩knockout.js,我仍然没有真正掌握底层逻辑。在下面的示例中,静态javascript数组boxList
没有对viewModel的任何引用,实际上它是完全为空的。仍然,foreach绑定没有困难掌握阵列。为什么呢?
注意:显然,绑定仅在调用ko.applyBindings
时有效,并且以viewModel为空参数。
HTML:
<div data-bind="foreach : boxList">
<div><input type="checkbox" ><label data-bind="text: name"></label></div>
</div>
JS:
var viewModel = {
};
var boxList = [
{ name : 'n1'},
{ name : 'n2' },
{ name : 'n3'},
{ name : 'n4' },
];
ko.applyBindings(viewModel);
JSFiddle:http://jsfiddle.net/e85sLmk4/
答案 0 :(得分:1)
在foreach: boxList
的情况下,绑定表达式是有效的Javascript表达式,即访问全局变量boxList
。因此Knockout能够解析变量并为其渲染复选框。
var viewModel = {
};
var boxList = [{
name: 'n1'
}, {
name: 'n2'
}, {
name: 'n3'
}, {
name: 'n4'
}, ];
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div data-bind="foreach : boxList">
<div>
<input type="checkbox">
<label data-bind="text: name"></label>
</div>
</div>
如果您在foreach
绑定或$root
或$data
上下文中使用了该绑定,则必须在视图模型下包含这些变量。因此,如果未在视图模型中声明变量foreach : $root.boxList
,则boxList
之类的绑定表达式将无效。
var viewModel = {
};
var boxList = [{
name: 'n1'
}, {
name: 'n2'
}, {
name: 'n3'
}, {
name: 'n4'
}, ];
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div data-bind="foreach : $root.boxList">
<div>
<input type="checkbox">
<label data-bind="text: name"></label>
</div>
</div>