2017-04-08 7 views
0

Aurelia ViewModelのオブジェクトプロパティを検証しようとしています。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) 

のViewModel - >表示

<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(AddUserForm)の代わりに.on(User)に変更してください。 – mgiesa

+0

@mgiesa現在有効なオブジェクトではなく、Userオブジェクトの検証がどのように行われますか? – Rodrigo

+0

"user"というプロパティがUserタイプで、自動的に検証するという事実を拾わない場合(私がそうしているかどうか覚えていない)、this.controller.addObject(this.user)あなたの検証メソッドで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)を与えている期待しています。その検証が完了した後に実行されます.then()それはすべてのオブジェクトとのバインディングを検証するようになります未定義

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

まま.validateを()、および:私はこの代わりに変更しようとするだろう。 テストプロジェクトで試してみると、これは私にとってはうまくいった。

私はあなたの質問を誤解し、これだけでは、しかし、それを解決しない場合は、このようなAddUserForm内のプロパティにUserオブジェクトIDを割り当てる試みることができる:

public userId = this.user.id; 

し、それに応じてValidationRulesやビューを変更:

のViewModel

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> 
関連する問題