我正在尝试使用foreach和复选框将Knockout observableArray绑定到我的UI,然后根据检查的内容创建一个数组。
我收到此错误: 未捕获的ReferenceError:无法处理绑定“template:function()...”
这是我的HTML:
<dl data-bind="template: { name: 'QuarterTemplate', foreach: Quarter, templateOptions: { selections: SelectedQuarters } }"></dl>
<script id="QuarterTemplate" type="text/html">
<dd>
<label>
<input type="checkbox" data-bind="attr: { value: quarter }, checked: $item.selections" />
<a data-bind="text: quarter" ></a>
</label>
</dd>
</script>
这是我的Knockout ViewModel:
function ViewModel() {
this.Quarter = ko.observableArray([
{ quarter: "Q1" },
{ quarter: "Q2" },
{ quarter: "Q3" },
{ quarter: "Q4" }
]);
this.SelectedQuarters = ko.observableArray();
this.SelectedQuarters.subscribe(function () {
console.log(this.SelectedQuarters());
});
}
$(document).ready(function () {
ko.applyBindings(new ViewModel());
});
我也有一个小提琴设置:
最终我想在控制台中看到的是这样的:
Q1
Q1,Q3
Q1,Q3,Q2
Q1,Q3,Q2,Q4
Q1,Q2,Q4
答案 0 :(得分:2)
templateOptions
仅在使用jQuery Templates plugin
时可用。使用KO本机模板时,最常见的是使用$root
或$parent
以这种方式绑定。以下是有关这些context variables的一些文档。
所以,它看起来像:
<dl data-bind="template: { name: 'QuarterTemplate', foreach: Quarter }"></dl>
<script id="QuarterTemplate" type="text/html">
<dd>
<label>
<input type="checkbox" data-bind="attr: { value: quarter }, checked: $parent.SelectedQuarters" />
<a data-bind="text: quarter" ></a>
</label>
</dd>
</script>
这是一个更新的小提琴:http://jsfiddle.net/rniemeyer/tY5TF/
答案 1 :(得分:0)
感谢。这有助于我使ObservableArray复选框工作。我根据你的例子修改了我的代码,并在你可以展示的JS“类”中获得更多信息。
// Define a "Quarter" class
function Quarter(id, name) {
return {
id : ko.observable(id),
name : ko.observable(name)
};
}
var viewModel = {
quarters : ko.observableArray([
new Quarter("Q1", "First Quarter"),
new Quarter("Q2", "Second Quarter"),
new Quarter("Q3", "Third Quarter"),
new Quarter("Q4", "Fourth Quarter"),
]),
selectedQuarters : ko.observableArray(["Q1", "Q3"])
};
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<ul data-bind="template: { name: 'QuarterTemplate', foreach: quarters }"></ul>
<script id="QuarterTemplate" type="text/html">
<li>
<input type="checkbox" data-bind="checkedValue: id, checked: $parent.selectedQuarters" />
<span data-bind="text: name"></span>
</li>
</script>
<pre data-bind="text: ko.toJSON(selectedQuarters, null, 2)"></pre>