2017-02-14 25 views
5

To jest mój bieżący kod:lista wyboru zestaw wybrana pozycja kątowa 2 ngModel

<select name="role" [(ngModel)]="user.role"> 
    <option *ngFor="let role of roles" [ngValue]="role" [attr.selected]="role == user.role ? 'true' : 'false'">{{role.name}}</option> 
</select> 

Ja ładuje wszystkie role w tablicy, a klasa użytkownik posiada atrybut rolę (który nie jest załadowany jak user.role = roles[0] ale tylko poprzez dane backendu).

Problem polega na tym, że wybrany atrybut nie działa, a mój wybór nie ma właściwej roli. Co ja robię źle?

Odpowiedz

6

Wystarczy usunąć

[attr.selected]="role == user.role ? 'true' : 'false'" 

i przypisać wybraną rolę user.role i ngModel uczyni zgodnego elementu wybrany jeden.

Jeśli obiekt jest obiektem role, przypisana instancja musi być identyczna.

Zobacz także ostatnio dodane porównania, niestandardowej https://github.com/angular/angular/issues/13268 dostępny od 4.0.0-beta.7

<select [compareWith]="compareFn" ... 
compareFn(val1, val2): boolean { 
    return val1 && val2 ? val1.id === val2.id : val1 === val2; 
} 
+0

Dziękuję, ma sens, że to nie działa, ponieważ obiekty nie są takie same odniesienia. Czy mogę użyć do tego 'ngComparator'? Albo jaka byłaby składnia? – JDOE

+0

Zaktualizowałem moją odpowiedź. To powinno być zawarte w 4.0.0-beta.7 –

+0

Tylko jedno pytanie, czy przetestowałeś to? Próbowałem, ale nie mogłem go uruchomić z funkcją '[compareWith]'. Podobno mój "val2" zawsze ma wartość null =/ – JDOE

2

nie trzeba używać [attr.selected]. [(ngModel)]="user.role" jest dwukierunkowe powiązanie danych, wybierze dopasowaną opcję z listy, jeśli wartość jest równa user.role. Można także użyć podstawowy [value]

<select name="role" [(ngModel)]="user.role"> 
    <option *ngFor="let role of roles" [value]="role">{{role.name}}</option> 
</select> 
+0

Gdzie jest dokumentacja dla [ngValue]? Nie znalazłem tego. Kiedy powinienem go użyć? –

0
<select [ngModel]="selectedDevice" (ngModelChange)="onChange($event)" name="sel2"> 
    <option [value]="i" *ngFor="let i of devices">{{i}}</option> 
</select> 

onChange(newValue) { 
    console.log(newValue); 
    this.selectedDevice = newValue;\ 
}