问题是当你使用时ko.mapping
,输入的每个属性都变成了observable
.
这意味着在您的第一个示例中,您可以执行以下操作:
viewModel.selectAll = function() {
viewModel.checkedProducts.removeAll();
ko.utils.arrayForEach(viewModel.Products(), function(product) {
viewModel.checkedProducts.push(product.Id); // Id is a plain value
});
};
在您的映射示例中,您必须执行以下操作:
viewModel.selectAll = function() {
viewModel.checkedProducts.removeAll();
ko.utils.arrayForEach(viewModel.Products(), function(product) {
viewModel.checkedProducts.push(product.Id()); // Id is an observable!
});
};
http://fiddle.jshell.net/ZeCWP/6/
真正干净的应该是这样的:
viewModel.selectAll = function() {
viewModel.checkedProducts.removeAll();
ko.utils.arrayForEach(viewModel.Products(), function(product) {
viewModel.checkedProducts.push( ko.utils.unwrapObservable(product.Id) );
});
};
这在这两种情况下都有效。但是在受控环境中,它并不是绝对必须使用的,unwrapObservable()
因为您知道该值将始终是可观察的或不可观察的。