J'utilise Angular 2 (TypeScript).
Je veux faire quelque chose pour la nouvelle sélection, mais ce que j'ai dans onChange () est toujours la dernière sélection. Comment puis-je obtenir une nouvelle sélection?
<select [(ngModel)]="selectedDevice" (change)="onChange($event)">
<option *ngFor="#i of devices">{{i}}</option>
</select>
onChange($event) {
console.log(this.selectedDevice);
// I want to do something here for new selectedDevice, but what I
// got here is always last selection, not the one I just select.
}
Si vous n'avez pas besoin de liaison de données bidirectionnelle:
<select (change)="onChange($event.target.value)">
<option *ngFor="let i of devices">{{i}}</option>
</select>
onChange(deviceValue) {
console.log(deviceValue);
}
Pour la liaison de données bidirectionnelle, séparez les liaisons d'événement et de propriété:
<select [ngModel]="selectedDevice" (ngModelChange)="onChange($event)" name="sel2">
<option [value]="i" *ngFor="let i of devices">{{i}}</option>
</select>
export class AppComponent {
devices = 'one two three'.split(' ');
selectedDevice = 'two';
onChange(newValue) {
console.log(newValue);
this.selectedDevice = newValue;
// ... do other stuff here ...
}
Si devices
est un tableau d'objets, liez-vous à ngValue
au lieu de value
:
<select [ngModel]="selectedDeviceObj" (ngModelChange)="onChangeObj($event)" name="sel3">
<option [ngValue]="i" *ngFor="let i of deviceObjects">{{i.name}}</option>
</select>
{{selectedDeviceObj | json}}
export class AppComponent {
deviceObjects = [{name: 1}, {name: 2}, {name: 3}];
selectedDeviceObj = this.deviceObjects[1];
onChangeObj(newObj) {
console.log(newObj);
this.selectedDeviceObj = newObj;
// ... do other stuff here ...
}
}
Plunker - n'utilise pas <form>
Plunker - utilise <form>
et utilise la nouvelle API de formulaire
Vous pouvez renvoyer la valeur au composant en créant une variable de référence sur la balise de sélection #device
et en la passant dans le gestionnaire de modifications onChange($event, device.value)
devrait avoir la nouvelle valeur.
<select [(ng-model)]="selectedDevice" #device (change)="onChange($event, device.value)">
<option *ng-for="#i of devices">{{i}}</option>
</select>
onChange($event, deviceValue) {
console.log(deviceValue);
}
tilisez simplement [ngValue] au lieu de [valeur] !!
export class Organisation {
description: string;
id: string;
name: string;
}
export class ScheduleComponent implements OnInit {
selectedOrg: Organisation;
orgs: Organisation[] = [];
constructor(private organisationService: OrganisationService) {}
get selectedOrgMod() {
return this.selectedOrg;
}
set selectedOrgMod(value) {
this.selectedOrg = value;
}
}
<div class="form-group">
<label for="organisation">Organisation
<select id="organisation" class="form-control" [(ngModel)]="selectedOrgMod" required>
<option *ngFor="let org of orgs" [ngValue]="org">{{org.name}}</option>
</select>
</label>
</div>
J'ai rencontré ce problème en effectuant le tutoriel sur les formulaires Angular 2 (version TypeScript) à l'adresse https://angular.io/docs/ts/latest/guide/forms. html
Le bloc sélection/option ne permettait pas de modifier la valeur de la sélection en sélectionnant l'une des options.
Faire ce que Mark Rajcok a suggéré a fonctionné, bien que je me demande si quelque chose m'a échappé dans le tutoriel original ou s'il y a eu une mise à jour. Dans tous les cas, ajouter
onChange(newVal) {
this.model.power = newVal;
}
to hero-form.component.ts dans la classe HeroFormComponent
et
(change)="onChange($event.target.value)"
to hero-form.component.html dans l'élément <select>
l'a fait fonctionner
Une autre option consiste à stocker l'objet en valeur sous forme de chaîne:
<select [ngModel]="selectedDevice | json" (ngModelChange)="onChange($event)">
<option [value]="i | json" *ngFor="let i of devices">{{i}}</option>
</select>
composant:
onChange(val) {
this.selectedDevice = JSON.parse(val);
}
C’est la seule façon pour moi d’obtenir une liaison bidirectionnelle permettant de définir la valeur de sélection au chargement de la page. En effet, ma liste qui remplit la zone de sélection n'était pas exactement le même objet que celui auquel ma sélection était liée et il doit s'agir du même objet, pas seulement des mêmes valeurs de propriété.
<mat-form-field>
<mat-select placeholder="Vacancies" [(ngModel)]="vacanciesSpinnerSelectedItem.code" (ngModelChange)="spinnerClick1($event)"
[ngModelOptions]="{standalone: true}" required>
<mat-option *ngFor="let spinnerValue of vacanciesSpinnerValues" [value]="spinnerValue?.code">{{spinnerValue.description}}</mat-option>
</mat-select>
Je l'ai utilisé pour angular liste déroulante des matériaux. fonctionne bien
utilisez selectionChange dans angular 6 et plus. exemple (selectionChange)= onChange($event.value)
les derniers ionic 3.2.0 ont modifié (changement) en (ionChange)
par exemple: HTML
<ion-select (ionChange)="function($event)"> <ion-option>1<ion-option>
</ion-select>
TS
function($event){
// this gives the selected element
console.log($event);
}
Dans angulaire 5 je l'ai fait de la manière suivante. récupère l'objet $ event.value au lieu de $ event.target.value
<mat-form-field color="warn">
<mat-select (ngModelChange)="onChangeTown($event)" class="form-width" formControlName="branch" [(ngModel)]="branch" placeholder="Enter branch">
<mat-option *ngFor="let branch of branchs" [value]="branch.value">
{{ branch.name }}
</mat-option>
</mat-select>
</mat-form-field>
onChangeTown(event): void {
const selectedTown = event;
console.log('selectedTown: ', selectedTown);
}