Использование проверки 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
привязок.