我编写了如下代码。
var ModalInit = function (serverModel, element) {
var dailyReport = new DailyMasterReport();
$.extend(true, dailyReport, ko.mapping.fromJS(serverModel));
dailyReport.SelectAll = ko.computed({
read: function () {
var isAllSelected = true;
ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
isAllSelected = isAllSelected && item.PodAvailable
});
return isAllSelected;
},
write: function (newValue) {
if (newValue) {
ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
item.PodAvailable(true);
});
} else {
ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
item.PodAvailable(false);
});
}
},
owner: DailyMasterReport
});
ko.applyBindings(dailyReport, $(element)[0]);
};
在上面的代码中,当我更改可用pod中的复选框时,它不会更新计算值。如果我在viewModel中编写计算逻辑,那么它会给出错误。
任何人都可以为这个问题提供解决方案。
答案 0 :(得分:0)
PodAvailable
是一个可观察的,因此您需要在read
函数中展开它:
read: function () {
var isAllSelected = true;
ko.utils.arrayForEach(dailyReport.AvailablePods(), function (item) {
isAllSelected = isAllSelected && item.PodAvailable();
});
return isAllSelected;
},
您可能也有兴趣改进此功能,因为它目前始终会检查每个项目以供选择。但是你真的只需要知道一个项目未被选中以返回false
。例如,如果未选中每个项目,则只需检查第一个项目。这是一个更有效的更新版本:
read: function () {
return ko.utils.arrayFirst(dailyReport.AvailablePods(), function (item) {
return !item.PodAvailable();
}) == null;
},