У меня есть группа флажков
Создано с привязкой данных foreach:
<input type="checkbox" data-bind="value: id, checked: $root.chkboxSelected" />
Которые берут свое проверенное состояние из observableArray. Таким образом, установка флажка добавит соответствующее значение в массив, стандартный knockoutjs, который отлично работает. Затем я хотел добавить простое правило:
если C отмечен, то A и B также должны быть проверены.
Как проще всего добавить такую логику в knockoutjs? Я пробовал использовать доступный для записи вычислимый наблюдаемый объект:
var viewModel = {
foo: observableArray(),
..
};
viewModel.chkboxSelected = ko.computed({
read: function() {
return this.foo();
},
write: function(value){
//add it if not added already
if($.inArray(value, this.foo()) < 0) {
this.foo.push(value);
}
// if C is present then A,B must be as well
if($.inArray("C", this.foo()) >= 0) {
if($.inArray("B", this.foo()) < 0) {
this.foo().push("B");
}
if($.inArray("A", this.foo()) < 0) {
this.foo().push("A");
}
}
},
owner: viewModel
});
Установка точки останова на функции чтения и записи: вызывается чтение и страница загружается нормально. Однако, когда я затем нажимаю любой флажок, я получаю следующую ошибку (точка останова записи никогда не срабатывает):
knockout-2.0.0.debug.js:2297
Uncaught TypeError: Object function dependentObservable() {
if (arguments.length > 0) {
if (typeof options["write"] === "function") {
// Writing a value
var valueForThis = options["owner"] || evaluatorFunctionTarget; // If undefined, it will default to "window" by convention. This might change in the future.
options["write"].apply(valueForThis, arguments);
} else {
throw "Cannot write a value to a dependentObservable unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.";
}
} else {
// Reading the value
if (!_hasBeenEvaluated)
evaluateImmediate();
ko.dependencyDetection.registerDependency(dependentObservable);
return _latestValue;
}
} has no method 'push'