2017-04-08 142 views
0

我想验证Aurelia ViewModel的对象属性。Aurelia验证嵌套对象

视图模型

@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

更改为.on(用户)而不是.on(AddUserForm) – mgiesa

+0

@mgiesa验证控制器如何获取验证User对象而不是当前作用域对象的事实? – Rodrigo

+0

如果它没有提到属性“user”是User类型并自动验证它的事实(我不记得它是否存在),那么可以编写this.controller.addObject(this.user)在你的validate方法调用this.controller.validate() – mgiesa

回答

0

的问题是在你的ValidationRules:

ValidationRules 
.ensure((u: User) => u.id).displayName('User').required() 
.on(AddUserForm) 

需求是

ValidationRules 
.ensure((u: User) => u.id).displayName('User').required() 
.on(User) 

然后让控制器运行此规则,你要么需要包括“ &验证“在你的价值的某处。绑定那个属性,像这样:

<input value.bind="user.id & validate" /> 

或调用controller.validate()之前,整个对象添加到控制器这样的:

this.controller.addObject(this.user); 

我用.addObject 所有的时间因为它会导致验证上运行不包含在您的标记中的属性,我发现我更喜欢这一点。

0

这时候我想它导致了错误:

validate() { 
    this.controller.validate(res => { 
     console.log(res.valid); 
    }) 
} 

.validate()预期的是ValidateInstruction,在你的榜样,你给(RES:任意)=>无效。我会尝试改变这个来代替:

this.controller.validate().then(res => { 
    console.log(res.valid); 
}); 

离开.validate()不确定会导致它来验证所有对象和绑定,和。那么()的验证完成后,将执行。 当我在我的测试项目中尝试过时,这对我有效。

如果我误解了你的问题,这本身并不但解决这个问题,你也可以尝试分配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>