在交换模型

时间:2017-02-07 19:36:54

标签: aurelia aurelia-validation

我使用动态构建的验证规则使用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:我的控件没有变化。即使交换对象,还有更好的方法来保持规则的存在吗?

1 个答案:

答案 0 :(得分:2)

回答问题1

如果您在没有参数的情况下致电controller.validate(),控制器将通过addObject验证您提供的所有对象。根据{{​​3}}中的用户界面,您似乎需要在removeObjectgoCreate方法中添加新对象实例之前调用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绑定中使用的对象+属性。