2017-08-10 3 views
0

Ich habe ein Problem in meiner Angular 4-Anwendung mit einem generierten Formular, und genauer mit einem <select> Tag, wo seine <option> Tags dynamisch generiert werden.Angular4 ausgewählte Option verschwindet nach der Auswahl in "select" Tag

Ich habe eine vereinfachte Version meines Codes in plunker.

Das Problem tritt sofort auf, nachdem ich eine Option auswähle, die nicht die erste Standardoption undefined ist: der Codewert ist richtig eingestellt, aber der Text innerhalb des <option> Tags verschwindet.

Wie könnte ich das beheben?

Antwort

2

ändern [ngValue] in Optionen auf [Wert]

<select [(ngModel)]="value"> 
    <option [ngValue]="undefined">(undefined)</option> 
    <option *ngFor="let entry of getEntries()" [value]="entry.code">{{entry.label}}</option> 
</select> 

Dies funktioniert. Diese

+0

Ganz einfache Lösung verwenden können, die gut funktioniert, danke! Aber weißt du, was der Unterschied zwischen 'ngValue' und' value' ist? Soll ich den ersten '[ngValue] =" undefined "' zu '[value] =" undefined "' auch ändern? – Dartz

+2

[ngValue] erstellt die Angular-Bindung für dieses Element. Der [Wert] ist jedoch eine einfache Attributbindung. Und wir sollten die Attributbindung nur ausführen, weil wir ngModel bereits verfügbar haben, um auf seine Werte zuzugreifen. – Ashvin777

0

ist die Lösung:

//our root app component 
import {Component, NgModule, VERSION} from '@angular/core'; 
import {BrowserModule} from '@angular/platform-browser'; 
import { FormsModule } from '@angular/forms'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <h1>Hello world</h1> 
    <p>Please select one option : </p> 
    <select (change) = 'myfun($event)' [value] = 'this.value'> 
     <option *ngFor="let entry of getEntries()" [selected]= 'this.value' (value)="entry.code" >{{entry.label}}</option> 
    </select> 
    <p>Selected value : {{value}}</p> 
    `, 
}) 
export class App { 
    value:string 

    constructor() { 
    } 

    myfun(event){ 
    console.log(event.target.value) 
    this.value = event.target.value; 
    } 

    getEntries() { 
    const entries = []; 
    entries.push({code:"1", label:"abra"}); 
    entries.push({code:"2", label:"kadabra"}); 

    return entries; 
    } 
} 

@NgModule({ 
    imports: [ BrowserModule, FormsModule ], 
    declarations: [ App ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 
+0

Hat es mit dir funktioniert? – ZAhmed

1

Warum verwenden Sie getEntries() Funktion direkt entries Array in Ihrem class App wie unten Code

//our root app component 
import {Component, NgModule, VERSION} from '@angular/core'; 
import {BrowserModule} from '@angular/platform-browser'; 
import { FormsModule } from '@angular/forms'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <h1>Hello world</h1> 
    <p>Please select one option : </p> 
    <select [(ngModel)]="value"> 
     <option [ngValue]="undefined">(undefined)</option> 
     <option *ngFor="let entry of entries" [ngValue]="entry.code">{{entry.label}}</option> 
    </select> 
    <p>Selected value : {{value}}</p> 
    `, 
}) 
export class App { 
    value = undefined; 
    entries=[{code:"1", label:"abra"},{code:"2", label:"kadabra"}]; 
    constructor() { 
    } 


} 

@NgModule({ 
    imports: [ BrowserModule, FormsModule ], 
    declarations: [ App ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 
Verwandte Themen