как реализовать зависимости флажков в knockoutjs

У меня есть группа флажков

  • флажков 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'
6
задан dgorissen 10 February 2012 в 13:21
поделиться