1

所以我有一个时间表列表,我需要为用户显示并显示他或她当前正在执行的时间表,并让他们可以跳上和跳下所述时间表。

我的视图模型看起来像这样

self = this;
self.shifts = ko.observableArray();
self.selectedShifts = ko.observableArray();

//I populate self.shifts here with a WEB API call

//Run through each shift and check if current user is on it and set checked / not checked    value for checkbox
        ko.utils.arrayForEach(self.shifts(), function(shift) {

           //Clear array
            self.usersOnShift([]);

            //Populate array with all users on the shift
            self.usersOnShift = ko.observableArray(WEB API CALL HERE);

            var userInShift = ko.utils.arrayFirst(self.usersOnShift(), function(user) {
                if (selectedUserId == user.ID) {
                    return true;
                } 
            });

            if (userInShift) {

                self.selectedShifts.push(shift.ID);
            }
        });

ko.applyBindings(self);

我的 HTML 看起来像这样

  <div class="simple_overlay" id="shiftOverlay">
        <div class="details">

            <div data-bind="foreach: shifts">

                <div><span class="staff-initials" data-bind="text:wardName">  </span><input type="checkbox" data-bind="value: ID, checked: $root.selectedShifts"/>  </div>
            </div>
            <div>
                <a href="#" data-bind="click: updateUserOnShifts">Connect</a>
                <a href="#" data-bind="click: closeShiftDialog">Close</a>
            </div>
        </div>
    </div>

我可以看到复选框的值已正确设置为相应班次的 ID。但是,我知道有问题的用户打开的班次没有被检查,我知道 selectedShifts observableArray 包含该值。

不知何故,“检查:$root.selectedShifts”调用/检查不起作用,但我知道它包含正确的值。我究竟做错了什么?

4

2 回答 2

10

问题是你的值是一个整数,但是当绑定到checkbox元素时,它变成了一个字符串。当checked绑定试图在数组中查找值时,它找不到匹配项,因为它使用严格相等进行比较并且(2 === "2")为假。

解决此问题的最简单方法是在将值添加到数组时将它们转换为字符串:

self.selectedShifts.push("" + shift.ID);

当然这意味着你的模型必须改变,这可能不是一个很好的解决方案。我想出了一个自定义绑定,checkedInArray它替换checked并支持任何类型的值。您可以了解它查看它的实际效果,并像这样使用它:

<input type="checkbox" data-bind="checkedInArray: {value: ID, array: $root.selectedShifts }" />

在 Knockout 2.3.0(仍在开发中)中将有一个新的绑定,checkedValue,这将允许您在绑定中使用任何类型的值checked。使用该版本,您可以更新您的 HTML 以使用checkedValue

<input type="checkbox" data-bind="checkedValue: ID, checked: $root.selectedShifts"/>
于 2013-03-22T02:10:38.567 回答
0

shift.ID 是可观察的属性吗?如果是,那么您需要将其添加到数组中,如下所示:

self.selectedShifts.push(shift.ID());

否则,您只是将整个 observable 添加到数组中,而不是值。

于 2013-03-21T22:45:39.873 回答