2016-04-06 7 views
0

ngControlを使用して、ユーザーの入力に基づいてエラークラスを適用しようとしています。Angular2フォーム - ngControl

どういうわけか、私は動作させることができません。適切なクラスが設定されていることがわかりますが、name.validnameはngControlです)を使用しようとすると動作しません。

HTML:

<div ngClass="{alert: name.invalid}"> 
     <label for="name">Name</label> 
     <input ngControl="name" #name id="name" [(ngModel)]="user.name"/> 
    </div> 

</div> 

JS

export class App { 
    userForm: any; 
    user: any; 

    constructor(
    private _formBuilder: FormBuilder) { 

    this.user = {name: 'Ben'}; 
    this.userForm = this._formBuilder.group({ 
     'name': ['', Validators.required] 
    }); 
    } 

} 

私は、彼らが(ちょうど他の例のために、ショーのように/ divsを非表示)このようにそれを使用しないことをangular.ioの例で見ましたか?

は簡単なplunkerです:http://plnkr.co/edit/BKx4yplIOu44tk7Mfolc?p=preview

入力フィールドが空の場合、私が上divalertクラスを取得することを期待するだろうが、それは起こりません。

+0

質問自体に減少したコードサンプルを挿入してください。 – Pavlo

答えて

2

は、実際には、あなたのテンプレートに変更するには、3つのものがあります。

  • ngClass[ngClass]でなければなりません。それ以外の場合、値は式ではなく文字列として扱われます。
  • #nameは、#name="ngForm"である必要があります。それ以外の場合は、コントロールではなくDOM要素を参照します。
  • Angular2のコントロールにはinvalidのプロパティはありませんが、validのコントロールのプロパティはありません。ここで

リファクタリングコードです:ここでは

<div [ngClass]="{alert: !name.valid}"> 
    <label for="name">Name</label> 
    <input ngControl="name" #name="ngForm" 
     required id="name" [(ngModel)]="user.name"/> 
</div> 

plunkrです:http://plnkr.co/edit/OJfb9VDqlrRH4oHXQJyg?p=preview

FormBuilderngControlとすることはできません。後者はインラインフォームを定義できるためです。 FormBuilderでは、代わりにngFormControlを使用する必要があります。ここで

はサンプルです:

<div [ngClass]="{alert: !userForm.controls.name.valid}"> 
    <label for="name">Name</label> 
    <input [ngFormControl]="userForm.controls.name" 
     id="name" [(ngModel)]="user.name"/> 
</div> 

は、より多くの詳細については、こちらの記事を参照してください。

+0

ありがとうございました。私はたくさんの組み合わせを試しました。しかし、あなたはいくつかのことを明確にしました、そして、私はそれが今働いているのを見ます。私はもう1つだけの質問があります。 'Uncaught(promise):例外:App @ 4:7の式 '{alert:!name.valid}がチェックされた後に変更されました.''私のアプリで表示されますそれが私がすべての変更と回避策から始めて、最終的にここで終わった理由です。あなたはアイデアを持っていますか、どのように修正するべきですか(私のアプリでは、name.validとname.touchedの組み合わせで起こります)。 – Ned

+1

あなたはようこそ!あなたのコンポーネントの 'ngOnInit'メソッド内の' ChangeDetectorRef'の 'detectChanges'メソッドを呼び出そうとするといいでしょう。この質問を参照してください:http://stackoverflow.com/questions/35520018/how-to-trigger-change-detection-in-angular2/35520764#35520764 –