2017-01-17 69 views
3

當選擇下拉更改時,我調用(change)指令的方法來檢查是否允許選擇的值,如果不允許選擇的值,則選擇再次返回上一個值(還原下拉菜單中的更改),但下拉菜單中的選定值仍顯示新的選定值,但ngModel變量是以前的值,例如:Angular 2選擇(更改)事件,不更新下拉菜單中的值

我選擇改變從A到B

HTML:

<select (change)="doCheck()" [(ngModel)]="test"> 
    <option [ngValue]="1">A</option> 
    <option [ngValue]="2">B</option> 
</select> 

組件:

test: number = 1; 

doCheck(){ 
    //Not allowed to change to B, so change back to A 
    this.test = 1; 
} 

test變量值1,而B是仍然在下拉列表中選中。

但是,當我在this.test = 1上添加setTimeout時,該值將變回A,但我不想在我的代碼中隨處添加setTimeout

任何幫助將不勝感激

回答

0

使用ngModelChange代替

<select (ngModelChange)="doCheck()" [(ngModel)]="test"> 

確保doCheck()ngModel更新test

角並不能保證事件綁定之後調用在任何特定的順序處理。但ngModelChange在更新模型後由NgModel發出。

如果修改值回那ngModel沒有更新,你可能需要

constructor(private cdRef:ChangeDetectorRef) {} 

doCheck(){ 
    //Not allowed to change to B, so change back to A 
    this.test = 1; 
    this.cdRef.detectChanges(); 
} 

否則ngModel可能保持舊值。

+0

我已經嘗試過了,但仍然沒有更新HTML中的選擇值和'(ngModelChange)'我不會知道新選定的值是什麼 – deanwilliammills

+0

對不起,我不明白你的意思是「I將不知道新選定的值是什麼「。當調用ngModelChange()時,新選定的值已經分配給'this.test'。你也可以像'(ngModelChange)=「doCheck($ event)」' –

+0

那樣顯式傳遞它,當'(ngModelChange)'在'[(ngModel)]'前面時,'[(ngModel)]'只在調用'(ngModelChange)'。所以我在'(ngModelChange)'前面移動了[[(ngModel)]',然後在調用'(ngModelChange)'前調用'[(ngModel)]',但仍然顯示** B **和不** A **,雖然'this.test'是1 – deanwilliammills

相關問題