【问题标题】:Binding a list of objects to a list of checkboxes将对象列表绑定到复选框列表
【发布时间】:2011-12-23 08:02:20
【问题描述】:

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

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”的示例处理原语并使用命名模板。我对如何使用对象和匿名模板执行此操作感到困惑。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    你可以这样做:

    <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>

    【讨论】:

    • 我推荐使用$parent.selectedPeople,因为它实际上会上升一级。 $root 会一直到根视图模型,如果你有嵌套的视图模型,那么$parent 是有保证的。
    • @RPNiemeyer,是否有关于使用attr: {value: xx } 而不仅仅是使用值绑定的问题?我在使检查的绑定正常工作时遇到问题,因为所有值都被统一检查。感谢您提供的所有记录支持!
    • value 绑定设置了双向绑定,这意味着它添加了事件处理程序(checked 已经这样做了)。因此,那里可能会发生冲突。 attr 绑定只会确保属性(在本例中为 value)随着视图模型数据的变化而更新。
    • @ShaunMcCarthy:checkedValue 绑定不再适用。 (当您使用旧的 attr: { value: id } 绑定对 Ryan 的原始答案发表评论时,它正确的。)
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2014-11-05
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多