Sto riscontrando problemi nella creazione di una selezione in Angular2 supportata da una matrice di oggetti anziché stringhe. Sapevo come farlo in AngularJS usando ngOptions, ma non sembra funzionare in Angular2 (sto usando alpha 42).Come utilizzare select/option/NgFor su una matrice di oggetti in Angular2
Nell'esempio seguente, ho quattro selezioni, ma solo due funzionano.
- 'Select String' è una semplice selezione basata su stringhe e funziona correttamente.
- 'Seleziona oggetto tramite rilegatura bidirezionale' era il mio tentativo di utilizzare il binding a 2 vie. Sfortunatamente, fallisce in due modi: quando la pagina viene caricata, la selezione mostra il valore sbagliato (pippo invece di barra), e quando seleziono un'opzione nell'elenco, il valore '[Oggetto oggetto]' viene inviato al backing store invece del valore corretto.
- 'Seleziona oggetto tramite evento' è stato il mio tentativo di ottenere il valore selezionato da $ event. Fallisce anche in due modi: il caricamento iniziale non è corretto allo stesso modo del # 2 e quando seleziono un'opzione nell'elenco, il valore '[oggetto oggetto]' viene recuperato dall'evento, quindi non posso ottieni il giusto valore La selezione viene cancellata.
- 'Seleziona oggetto tramite stringa' è l'unico approccio che utilizza un oggetto che funziona. Sfortunatamente, funziona davvero usando l'array di stringhe da # 1 e convertendo il valore da una stringa all'oggetto e viceversa.
posso fare # 4 se questo è il modo previsto, ma sembra piuttosto goffo. C'è un altro approccio? Sono troppo presto nell'alfa? Ho fatto qualcosa di sciocco?
import {Component, FORM_DIRECTIVES, NgFor} from 'angular2/angular2';
interface TestObject {
name:string;
value:number;
}
@Component({
selector: 'app',
template: `
<h4>Select String</h4>
<select [(ng-model)]="strValue">
<option *ng-for="#o of strArray" [value]="o">{{o}}</option>
</select>
<h4>Select Object via 2-way binding</h4>
<select [(ng-model)]="objValue1">
<option *ng-for="#o of objArray" [value]="o">{{o.name}}</option>
</select>
<h4>Select Object via event</h4>
<select [ng-model]="objValue2" (change)="updateObjValue2($event)">
<option *ng-for="#o of objArray" [value]="o">{{o.name}}</option>
</select>
<h4>Select Object via string</h4>
<select [ng-model]="objValue3.name" (change)="updateObjValue3($event)">
<option *ng-for="#o of strArray" [value]="o">{{o}}</option>
</select>
<div><button (click)="printValues()">Print Values</button></div>
`,
directives: [FORM_DIRECTIVES, NgFor]
})
export class AppComponent {
objArray:TestObject[] = [{name: 'foo', value: 1}, {name: 'bar', value: 1}];
objValue1:TestObject = this.objArray[1];
objValue2:TestObject = this.objArray[1];
objValue3:TestObject = this.objArray[1];
strArray:string[] = this.objArray.map((obj:TestObject) => obj.name);
strValue:string = this.strArray[1];
updateObjValue2(event:Event):void {
const value:string = (<HTMLSelectElement>event.srcElement).value;
this.objValue2 = this.objArray.find((obj:TestObject) => obj.name === value);
}
updateObjValue3(event:Event):void {
const value:string = (<HTMLSelectElement>event.srcElement).value;
this.objValue3 = this.objArray.find((obj:TestObject) => obj.name === value);
}
printValues():void {
console.log('strValue', this.strValue);
console.log('objValue1', this.objValue1);
console.log('objValue2', this.objValue2);
console.log('objValue3', this.objValue3);
}
}
Cari viaggiatori del tempo di venire qui nel 2016 o dopo! La [domanda collegata] (http://stackoverflow.com/q/35945001) ha una [risposta migliore] (http://stackoverflow.com/a/35945293) che non usa hacky object-to-json-to- conversione di oggetti. –
Vero. È strano, tuttavia, che questo sia stato contrassegnato come un duplicato dell'altro quando questa domanda è anteriore all'altra di 5 mesi. – user3221325