Knockout JS: проблемы с проверкой нескольких строк с помощью выпадающих списков - PullRequest
0 голосов
/ 31 января 2020

Итак, я пытаюсь проверить два выпадающих списка, которые у меня отображаются при нажатии кнопки. Когда раскрывающиеся списки запускаются впервые, они инициируются со значением undefined, поскольку ничего не было выбрано. Это то, что я хочу. Но когда я нажимаю кнопку добавления, чтобы проверить выпадающие списки, прежде чем добавить еще одну строку, проверка никогда не происходит.

JS

 ko.validation.init({
    insertMessages: false,
    errorMessageClass: "ErrorLine"
  });
  ko.validation.rules['bothUndefined'] = {
    getValue: function (o) {
      return (typeof o === 'function' ? o() : o);
    },
    validator: function (val, params) {
      var self = this;

      var anyOne = ko.utils.arrayForEach(params, function (param) {
        if (typeof param === "function") {
            return typeof param() === "undefined";
          } else {
            return (typeof param === "undefined");
          }
        });

      return (typeof anyOne !== "undefined");
    },
    message: 'Please select one change.'
  };
  ko.validation.registerExtenders();

function BookPossessionTransferVM() {
    var self = this;
.
.
.
    self.PossessionChanges  = ko.observableArray([]);
    self.PossessionChangesErrors  =  ko.validation.group(self.PossessionChanges(), { deep: true, live: true });
    self.PossessionChanges.push(new PossessionChangeVM(self.PossessionChanges().length +1))
.
.
.
self.addPossessionChange = function () {
      if (self.PossessionChanges().length < 1) {
        self.PossessionChanges.push(new PossessionChangesVM(self.PossessionChanges().length + 1,
          self.AllFrom()));
      } else {
        self.PossessionChangesErrors.showAllMessages();
      }
    }
}

 function PossessionChangeVM(possessionChangeId) {
    var self = this;

    self.possessionChangeId = ko.observable(possessionChangeId);
    self.SelectedFrom =  ko.validatedObservable();
    self.SelectedTo =  ko.validatedObservable();
self.IsValidRow = ko.pureComputed(function() {
      return typeof self.SelectedFrom !== "undefined" && typeof self.SelectedTo !== "undefined";
    }).extend({
      bothUndefined: {
        params: [self.SelectedFrom, self.SelectedTo]
      }
    });

    self.ChangeType = ko.pureComputed(function() {
      if (self.SelectedFrom() !== undefined && self.SelectedTo() !== undefined) {
        return 'Update';
      } else if (self.SelectedFrom() === undefined && self.SelectedTo() === undefined) {
          return '';
      } else if (self.SelectedFrom() === undefined) {
        return 'Add';
      } else if (self.SelectedTo() === undefined) {
        return 'Remove';
      } else { return ''; }
    });
  }

После нажатия кнопки добавления я ожидаю, что у PossessionChangesErrors возникнет одна проблема, поскольку она должна загружаться с неопределенными параметрами. Но я ничего не получаю. Еще раз спасибо за помощь!

РЕДАКТИРОВАТЬ: Теперь у меня работает проверка, но я не могу очистить проверку, чтобы создать новую строку после выбора одного из раскрывающихся списков. Вот скрипка: https://jsfiddle.net/p6x1nqm5/18/

1 Ответ

0 голосов
/ 01 февраля 2020

Оказывается, у меня просто не было правильной логики c для проверки. Вот новая скрипка с изменениями. https://jsfiddle.net/zw80kh2n/2/

self.IsValidRow стал

  self.IsValidRow = ko.pureComputed(function() {
      return (!(self.SelectedFrom() === undefined && self.SelectedTo() === undefined))
    }).extend({      bothUndefined: {}
    });

, а проверка стала

ko.validation.rules['bothUndefined'] = {
    getValue: function (o) {
      return (typeof o === 'function' ? o() : o);
    },
    validator: function (val) {
      return val;
    },
    message: 'Please select one change.'
  };
  ko.validation.registerExtenders();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...