У меня есть группа флажковкак реализовать зависимости флажка в knockoutjs
- флажок
- Флажка Б
- Флажок С
Сгенерированного с привязкой данных Foreach:
<input type="checkbox" data-bind="value: id, checked: $root.chkboxSelected" />
проверенное состояние из наблюдаемого массива. Таким образом, при проверке поля добавляется соответствующее значение массиву, стандартный класс knockoutjs, который отлично работает. Затем я хотел добавить простое правило: 0 C
Если проверка C, то необходимо также проверить A и B.
Каков самый чистый способ добавить эту логику в нокаут? Я попытался с записываемой вычислимая наблюдаемом:
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'
Работает отлично, спасибо! (скрипка дает 404, хотя) – dgorissen
Также следует добавить к этому, что для правильного использования тега
Почему «shouldBeDisabled» вызывается для каждого элемента массива элементов? Я понимаю, почему он вызывается при изменении 'self.checked', но почему он перебирает весь массив' items'? – arb