交换模型时使用Aurelia验证addObject和removeObject

交换模型时使用Aurelia验证addObject和removeObject,aurelia,Aurelia,我在使用带有动态构建的验证规则的Aurelia验证时遇到了问题。我成功地(但不是很优雅地)基于表单控件数组的validation属性动态创建了规则,如下所示: ctrlAccountSettings = [ {label: 'Code', type: 'my-textbox', bind: 'acc_code', validation: '.required().minLength(17).maxLength(30)'}, {label: 'Name_orig', type: 'my-t

我在使用带有动态构建的验证规则的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()'}];
以下代码用于在我的视图模型中创建/应用规则:

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

当您在没有参数的情况下调用
controller.validate()
时,控制器将通过
addObject
验证您提供给它的所有对象。根据中的UI,在
goCreate
goEdit
方法中添加新对象实例之前,似乎需要调用
removeObject
删除先前添加的对象。在不调用
removeObject
(或
reset
)的情况下,控制器认为仍然需要验证先前添加的对象


对问题2的回答

我们正在寻找改进从数据中添加创建规则的过程的方法。以下是另一种方法:

以下是为此增强API的问题:


对问题3的回答


gist通过将对象和规则传递给
controller.addObject
,在对象和规则之间建立关联。当您使用
addObject
时,这是最好的方法。也就是说,您可能不需要使用addObject。如果删除
addObject
/
reset
代码并在绑定中指定规则,代码可能会更简单。这将导致控制器使用默认行为,仅验证当前在
&validate
绑定中使用的对象和属性。

问题1的答案

当您在没有参数的情况下调用
controller.validate()
时,控制器将通过
addObject
验证您提供给它的所有对象。根据中的UI,在
goCreate
goEdit
方法中添加新对象实例之前,似乎需要调用
removeObject
删除先前添加的对象。在不调用
removeObject
(或
reset
)的情况下,控制器认为仍然需要验证先前添加的对象


对问题2的回答

我们正在寻找改进从数据中添加创建规则的过程的方法。以下是另一种方法:

以下是为此增强API的问题:


对问题3的回答


gist通过将对象和规则传递给
controller.addObject
,在对象和规则之间建立关联。当您使用
addObject
时,这是最好的方法。也就是说,您可能不需要使用addObject。如果删除
addObject
/
reset
代码并在绑定中指定规则,代码可能会更简单。这将导致控制器使用默认行为,该行为仅验证当前在
&validate
绑定中使用的对象和属性。

以下要点可用于创建问题的复制:谢谢。这是我试图做的一个近似值。看起来我遇到的主要问题已通过在交换实体之前添加
controller.reset()
得到纠正。但这并不能回答问题2和3。对我的代码有什么想法或建议吗?这里有一个要点,你可以用来复制你的问题:谢谢。这是我试图做的一个近似值。看起来我遇到的主要问题已通过在交换实体之前添加
controller.reset()
得到纠正。但这并不能回答问题2和3。对我的代码有什么想法或建议吗?非常感谢!我感谢你抽出时间给我一个专家的答案。我感谢所有已经投入到像Aurelia validation这样的工具中的东西,我相信它将继续获得越来越多的支持!出于好奇,
reset()
是否也会删除所有对象,或者只是在保留规则的同时清除当前验证消息?清除时不会删除给定的对象。重置与验证相反。请注意最后一个问题。我喜欢你提出的第三季度解决方案。如果绑定中没有验证规则,那么该绑定中的
&validate:rules
是否会导致错误?由于表单控件是根据数据自动生成的,因此无论该输入字段是否存在验证规则,都最容易在所有控件上包含绑定行为。如果
&validate
绑定表达式中使用的属性没有任何关联规则,则可以。不会有例外。非常感谢!我感谢你抽出时间给我一个专家的答案。我感谢所有已经投入到像Aurelia validation这样的工具中的东西,我相信它将继续获得越来越多的支持!出于好奇,
reset()
是否也会删除所有对象,或者只是在保留规则的同时清除当前验证消息?清除时不会删除给定的对象。我是谁