2017-04-08 101 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>