我试图验证Aurelia ViewModel的对象属性。
@autoinject
class AddUserForm {
user: User;
controller: ValidationController;
constructor(controllerFactory: ValidationControllerFactory) {
this.controller = controllerFactory.createForCurrentScope();
}
validate() {
this.controller.validate.then(res => {
console.log(res.valid);
})
}
}
ValidationRules
.ensure((u: User) => u.id).displayName('User').required()
.on(AddUserForm)
<template>
<form click.trigger="validate()">
<input type="text" value.bind="user.id & validate" />
</form>
</template>
class User {
id: string
}
我遇到的问题是验证器没有拿起嵌套的用户对象。我错过了一些让这个工作的东西?我读了docs,看起来这应该有效。我正在使用该插件的^1.0.0
版本。
答案 0 :(得分:1)
问题在于您的ValidationRules:
ValidationRules
.ensure((u: User) => u.id).displayName('User').required()
.on(AddUserForm)
需要
ValidationRules
.ensure((u: User) => u.id).displayName('User').required()
.on(User)
然后要让控制器运行此规则,您需要包含&#34;&amp;验证&#34;在你的value.bind 中的某个地方,如下所示:
<input value.bind="user.id & validate" />
或在调用controller.validate()之前,将整个对象添加到控制器,如下所示:
this.controller.addObject(this.user);
我一直使用.addObject ,因为它会导致验证在标记中包含的属性上运行,我觉得我更喜欢它。
答案 1 :(得分:0)
我尝试时导致错误:
validate() {
this.controller.validate(res => {
console.log(res.valid);
})
}
.validate()需要一个ValidateInstruction,在你的例子中你给予(res:any)=&gt;无效。我会尝试改为:
this.controller.validate().then(res => {
console.log(res.valid);
});
离开.validate()undefined将导致它验证所有对象和绑定,并且.then()将在验证完成后执行。 当我在我的测试项目中尝试时,这对我有用。
如果我误解了您的问题,但这并没有解决问题,您也可以尝试将User
个对象ID分配给AddUserForm
中的属性,如下所示:
public userId = this.user.id;
更改您的ValidationRules并相应地查看:
<强>视图模型强>
ValidationRules
.ensure((u: AddUserForm) => u.userId)
.displayName("User")
.required()
.on(this);
查看强>
<template>
<form click.delegate="validate()">
<input type="text" value.bind="userId & validate" />
</form>
</template>