将对象列表绑定到复选框列表

Gen*_*sky 39 knockout.js

我有一个对象列表,每个对象都有几个字段,如下所示:

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([]);
}
Run Code Online (Sandbox Code Playgroud)

我想建立一个复选框列表,每个人一个,这些内容如下:

<ul data-bind="foreach: people">
    <li>
        <input type="checkbox" data-bind="value: id, checked: ?">
        <span data-bind="name"></span>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我的困惑是,在checkbox data-bind属性中,我想引用所选对象(即person人或者id),以及所有选定人员的列表.我如何在foreach绑定范围内引用它?

我猜一个推论是:我如何引用绑定的对象?这里" this"似乎是绑定到窗口,而不是对象.

" checked敲除knockoutjs网站上的绑定 "的示例处理基元并使用命名模板.我对如何使用对象和匿名模板这样做很困惑.

RP *_*yer 69

你可以这样做:

<ul data-bind="foreach: people">
    <li>
        <input type="checkbox" 
               data-bind="checkedValue: id, checked: $parent.selectedPeople">
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

有了这种ViewModel:

var viewModel = {
    people: ko.observableArray(listOfPeople),
    selectedPeople: ko.observableArray()
};
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`$ parent.selectedPeople`,因为它实际上会上升一级.`$ root`将一直到根视图模型,如果你有嵌套的视图模型,那么`$ parent`是有保证的. (7认同)