2017-02-07 12 views
0

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

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()'}]; 

И этот код, чтобы создать/применять правила, на мой взгляд-модели :

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: Мои элементы управления не меняются. Есть ли лучший способ сохранить правила на месте, даже когда объект поменяется?

+0

Вот что вы можете использовать для создания вашей проблемы: https://gist.run/?id=381fdb1a4b0865a4c25026187db865ce –

+0

Спасибо. Вот пример того, что я пытаюсь сделать.Похоже, что основная проблема, которую я испытывал, исправляется добавлением 'controller.reset()' перед заменой объекта. Но это не отвечает на вопросы 2 и 3. Любые идеи или предложения, касающиеся моего кода? https://gist.run/?id=22f17210934d436e231b223b235fcd32 – LStarky

ответ

2

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

При вызове controller.validate() без каких-либо аргументов, контроллер будет проверять все объекты, которые вы дали его через addObject. На основании пользовательского интерфейса в your gist, вам нужно позвонить removeObject, чтобы удалить ранее добавленный объект, прежде чем добавлять экземпляр нового объекта в свои методы goCreate или goEdit. Here's an example. Без вызова removeObject (или reset) контроллер считает, что ему еще нужно проверить ранее добавленные объекты.

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

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

Вот вопрос для повышения API для этого: https://github.com/aurelia/validation/issues/400

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

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

+0

Спасибо, ооочень много! Я ценю, что вы нашли время, чтобы дать мне экспертный ответ. Я ценю все, что уже вошло в создание таких инструментов, как Aurelia-validation, и я уверен, что он будет продолжать получать все большую поддержку! – LStarky

+0

Из любопытства, 'reset()' также удаляет все объекты или просто очищает текущие сообщения проверки, оставляя правила на месте? – LStarky

+1

Очищает, не удаляя объект (ы), он был дан. Сброс предназначен для того, чтобы быть противоположным проверке. –