我有一个对象列表,每个对象都有几个字段,如下所示:
function Person(id,name,age) {
this.id = id;
this.name = name;
this.age = age;
}
var listOfPeople = [
new Person(1, 'Fred', 25),
new Person(2, 'Joe', 60),
new Person(3, 'Sally', 43)
];
var viewModel = {
this.people = ko.observableArray(listOfPeople);
this.selectedPeople = ko.observableArray([]);
}
我想建立一个复选框列表,每个人都有一个复选框,这些都是这样的:
<ul data-bind="foreach: people">
<li>
<input type="checkbox" data-bind="value: id, checked: ?">
<span data-bind="name"></span>
</li>
</ul>
我的困惑是,在复选框data-bind
属性中,我想同时引用所选对象(即person
或人id
),以及至于所有选定人员的名单。我如何在foreach
绑定范围内引用它?
我猜一个推论是:我如何引用绑定的对象?这里“this
”似乎绑定到窗口,而不是对象。
“checked
binding on the knockoutjs site”的示例处理基元并使用命名模板。我对如何使用对象和匿名模板这样做感到困惑。
答案 0 :(得分:66)
您可以执行以下操作:
<ul data-bind="foreach: people">
<li>
<input type="checkbox"
data-bind="checkedValue: id, checked: $parent.selectedPeople">
</li>
</ul>
使用这种ViewModel:
var viewModel = {
people: ko.observableArray(listOfPeople),
selectedPeople: ko.observableArray()
};
value
属性控制checked
绑定在绑定数组时从数组中添加/删除的内容。您还可以编写一个dependentObservable,如果需要,可以使用实际对象填充数组。
直播示例:
function Person(id,name,age) {
this.id = id;
this.name = name;
this.age = age;
}
var listOfPeople = [
new Person(1, 'Fred', 25),
new Person(2, 'Joe', 60),
new Person(3, 'Sally', 43)
];
var viewModel = {
people: ko.observableArray(listOfPeople),
selectedPeople: ko.observableArray([1])
};
ko.applyBindings(viewModel);
<ul data-bind="foreach: people">
<li>
<input type="checkbox" value="" data-bind="checkedValue: id, checked: $parent.selectedPeople"><span data-bind="text: name"></span>
</li>
</ul>
<hr/>
<div data-bind="text: ko.toJSON($root)"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>