我使用动态构建的验证规则使用Aurelia验证时遇到了问题。我在基于表单控件数组的验证属性动态创建规则时成功(但不是那么优雅),如下所示:
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 :(得分:2)
回答问题1
如果您在没有参数的情况下致电controller.validate()
,控制器将通过addObject
验证您提供的所有对象。根据{{3}}中的用户界面,您似乎需要在removeObject
或goCreate
方法中添加新对象实例之前调用goEdit
删除之前添加的对象。 your gist。在不调用removeObject
(或reset
)的情况下,控制器认为它仍然需要验证先前添加的对象。
回答问题2
我们正在研究改进从数据添加创建规则的过程的方法。这是另一种方法: Here's an example
以下是为此增强API的问题: https://github.com/aurelia/validation/issues/363
回答问题3
您的要点通过将对象和规则传递给controller.addObject
来建立对象与其规则之间的关联。当您使用addObject
时,这是执行此操作的最佳方式。也就是说,您可能不需要使用addObject。如果您删除addObject
/ reset
代码并在绑定https://github.com/aurelia/validation/issues/400中指定规则,则代码可能会更简单。这将导致控制器使用默认行为,该行为仅验证当前在& validate
绑定中使用的对象+属性。