Использование проверки Aurelia addObject и removeObject при замене модели

Я сталкиваюсь с проблемами при использовании Aurelia Validation с динамически созданными правилами проверки. Мне удалось (но не так элегантно) создать правила динамически на основе свойства проверки массива элементов управления формы, например:

ctrlAccountSettings = [
  {label: 'Code', type: 'my-textbox', bind: 'acc_code', validation: '.required().minLength(17).maxLength(30)'},
  {label: 'Name_orig', type: 'my-textbox', bind: 'acc_name_orig', validation: '.required().minLength(3).maxLength(100)'},
  {label: 'Name_tran', type: 'my-textbox', bind: 'acc_name_tran', validation: '.minLength(3).maxLength(100)'},
  {label: 'Description', type: 'my-textarea', rows: '3', bind: 'acc_description', validation: '.maxLength(255)'},
  {label: 'Status', type: 'my-dropdown', bind: 'acc_status', enum: 'ActiveInactive', validation: '.required()'}];

И этот код для создания / применения правил в моей view-модели:

attached() {
  // define rules based on controls
  this.rules = [];
  this.controls.map(control => {
    if (control.validation) {
      if (control.validation.match(/\.required\(\)/)) { this.rules.push(ValidationRules.ensure(control.bind).required().rules[0]); }
      let minLength = control.validation.match(/\.minLength\(([0-9]+)\)/);
      if (minLength) { this.rules.push(ValidationRules.ensure(control.bind).minLength(minLength[1]).rules[0]); }
      let maxLength = control.validation.match(/\.maxLength\(([0-9]+)\)/);
      if (maxLength) { this.rules.push(ValidationRules.ensure(control.bind).maxLength(maxLength[1]).rules[0]); }
    }
  });
  // initialize modelEdit and add validation rules
  this.modelEdit = {};
  // this.validationCtrl.removeAllObjects();            doesn't exist
  // this.validationCtrl.removeObject(this.modelEdit);  doesn't work
  // this.validationCtrl.destroy();                     not sure how to recover from this
  this.validationCtrl.addObject(this.modelEdit, this.rules);
}

Проблема в том, что, поскольку один и тот же компонент повторно присоединяется несколько раз, я получаю дубликаты правил, которые мешают проверке формы.

Вопрос 1 (самый важный): как мне пользоваться removeObject() или аналогичный метод для очистки предыдущей проверки?

Вопрос 2: Есть ли лучший способ динамического применения правил проверки из моего массива управляющих объектов? Мне не нравится создавать this.rules.push() вариант для каждого типа правила.

Вопрос 3: Мой контроль не меняется. Есть ли лучший способ сохранить правила, даже если объект выгружен?

1 ответ

Решение

Ответ на вопрос 1

Когда вы звоните controller.validate() без аргументов контроллер проверит все объекты, которые вы ему дали addObject, Исходя из пользовательского интерфейса в вашей сути, кажется, что вам нужно позвонить removeObject удалить ранее добавленный объект перед добавлением нового экземпляра объекта в goCreate или же goEdit методы. Вот пример. Без звонка removeObject (или же reset) контроллер считает, что ему все еще нужно проверить ранее добавленные объекты.

Ответ на вопрос 2

Мы ищем способы улучшить процесс добавления правил создания данных. Вот альтернативный подход: https://github.com/aurelia/validation/issues/363

Вот проблема для улучшения API для этого: https://github.com/aurelia/validation/issues/400

Ответ на вопрос 3

Ваша сущность устанавливает связь между объектом и его правилами, передавая объект и правила controller.addObject, Это лучший способ сделать это, когда вы используете addObject, Тем не менее, вам, вероятно, не нужно использовать addObject. Ваш код может быть проще, если вы удалите addObject / reset код и укажите правила в ваших привязках, как это. Это заставит контроллер использовать поведение по умолчанию, которое проверяет только объекты + свойства, используемые в настоящее время в & validate привязок.

Другие вопросы по тегам