2016-04-06 22 views
0

我試圖使用ngControl根據用戶的輸入應用錯誤類。Angular2 Forms - ngControl

不知何故,我不能讓它工作。我看到設置了適當的類(行ng無效),但是當試圖使用name.valid(其中name是我的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] 
    }); 
    } 

} 

我對angular.io例子中看到,他們使用這樣的(只是對於其它情況,如顯示/隱藏divs)?

這裏的簡單plunker:http://plnkr.co/edit/BKx4yplIOu44tk7Mfolc?p=preview

當輸入字段爲空,我預計上div得到alert類,但這並沒有發生。

+0

請填上這個問題本身減少的代碼示例。 – Pavlo

回答

2

事實上,有三件事情在你的模板改變:

  • 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

非常感謝。我嘗試了很多組合,最後我做了一些拼寫錯誤。但是你已經清楚了一些事情,而且我看到它現在正在工作。我只有一個問題。我在控制檯看到拋出了這個異常:'未捕獲(承諾):EXCEPTION:表達式'{alert:!name.valid} in App @ 4:7'在檢查後發生了變化.'我在我的應用程序中看到它,這就是爲什麼我開始了所有的變化和解決方法,並最終在這裏結束。你有一個想法,它應該如何解決(在我的應用程序中,它發生在name.valid和name.touched的組合上)。 – Ned

+1

不客氣!我認爲你可以嘗試在組件的ngOnInit方法中調用'ChangeDetectorRef'的'detectChanges'方法。看到這個問題:http://stackoverflow.com/questions/35520018/how-to-trigger-change-detection-in-angular2/35520764#35520764。 –