У меня есть группа флажков
- флажок A
- флажок B
- флажок C
Генерируется с данными 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'