交换模型时使用Aurelia验证addObject和removeObject
我在使用带有动态构建的验证规则的Aurelia验证时遇到了问题。我成功地(但不是很优雅地)基于表单控件数组的validation属性动态创建了规则,如下所示:交换模型时使用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
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()
是否也会删除所有对象,或者只是在保留规则的同时清除当前验证消息?清除时不会删除给定的对象。我是谁