Jak Mogę uzyskać nowy wybór w "Wybierz" w Angular 2?

Używam Angular 2 (maszynopis).

Chcę coś zrobić z nową selekcją, ale to, co dostaję onChange(), jest zawsze ostatnią selekcją. Jak Mogę uzyskać nowy wybór?

<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 with the new selectedDevice, but what I
    // get here is always the last selection, not the one I just selected.
}
Author: HDJEMAI, 2015-11-13

14 answers

Jeśli nie potrzebujesz dwukierunkowego wiązania danych:

<select (change)="onChange($event.target.value)">
    <option *ngFor="let i of devices">{{i}}</option>
</select>

onChange(deviceValue) {
    console.log(deviceValue);
}

Dla dwukierunkowego powiązania danych, oddziel powiązania zdarzeń i właściwości:

<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 ...
}

Jeśli devices jest tablicą obiektów, binduj ngValue zamiast 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 - nie używa <form>
Plunker - używa <form> i używa nowego API formularzy

 826
Author: Mark Rajcok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 14:44:55

Możesz przekazać wartość z powrotem do komponentu, tworząc zmienną referencyjną na znaczniku select #device i przekazując ją do obsługi zmiany onChange($event, device.value) powinna mieć nową wartość

<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);
}
 43
Author: Brocco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-14 00:07:40

Wystarczy użyć [ngValue] zamiast [value]!!

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>
 24
Author: robert king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 05:34:40

Napotkałem ten problem podczas robienia Angular 2 forms tutorial (Wersja TypeScript) w https://angular.io/docs/ts/latest/guide/forms.html

Blok select/option nie pozwalał na zmianę wartości zaznaczenia poprzez wybranie jednej z opcji.

Robienie tego, co sugerował Mark Rajcok, zadziałało, chociaż zastanawiam się, czy jest coś, co przegapiłem w oryginalnym samouczku, czy była aktualizacja. W każdym razie dodanie

onChange(newVal) {
    this.model.power = newVal;
}

To postać bohatera.komponent.ts w klasie HeroFormComponent

I

(change)="onChange($event.target.value)"
Do postaci bohatera.komponent.html w elemencie <select> sprawił, że działał
 14
Author: jarisky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 16:44:43

Użyj funkcji selectionChange w angular 6 i nowszych. przykład (selectionChange)= onChange($event.value)

 7
Author: valentine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 14:26:17

Inną opcją jest zapisanie obiektu w wartości jako łańcuch znaków:

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

Składnik:

onChange(val) {
    this.selectedDevice = JSON.parse(val);
}

Był to jedyny sposób, w jaki mogłem uzyskać dwukierunkowe powiązanie, aby ustawić wartość select przy ładowaniu strony. Wynika to z faktu, że moja lista wypełniająca pole select nie była dokładnie tym samym obiektem, do którego przypisany był mój select I musi to być ten sam obiekt, a nie tylko te same wartości właściwości.

 3
Author: kravits88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-05 06:07:46
<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>

Użyłem tego do kątowego spadku materiału. działa dobrze

 3
Author: Apurv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 08:06:26

Kątowa 7/8

Od angular 6, użycie właściwości wejściowej ngModel z dyrektywą reactive forms zostało wycofane i całkowicie usunięte w angular 7+. przeczytaj oficjalny dokument tutaj.

Za pomocą metody reactive form można uzyskać / ustawić wybrane dane jako;

      //in your template
 <select formControlName="person" (change)="onChange($event)"class="form-control">
    <option [value]="null" disabled>Choose person</option>
      <option *ngFor="let person of persons" [value]="person"> 
        {{person.name}}
    </option>
 </select> 


 //in your ts
 onChange($event) {
    let person = this.peopleForm.get("person").value
    console.log("selected person--->", person);
    // this.peopleForm.get("person").setValue(person.id);
  }
 2
Author: 7guyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-24 20:15:35

W Angular 8 możesz po prostu użyć "selectionChange" w następujący sposób:

 <mat-select  [(value)]="selectedData" (selectionChange)="onChange()" >
  <mat-option *ngFor="let i of data" [value]="i.ItemID">
  {{i.ItemName}}
  </mat-option>
 </mat-select>
 2
Author: B.Habibzadeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-10 08:32:01

I was has same problem and i solved using the below code:

(change)="onChange($event.target.value)"
 2
Author: Abd Abughazaleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-30 09:18:53

Najnowsza wersja ionic 3.2.0 została zmodyfikowana (change) na (ionChange)

Eg: HTML

<ion-select (ionChange)="function($event)"> <ion-option>1<ion-option>
</ion-select>

TS

function($event){
// this gives the selected element
 console.log($event);

}
 1
Author: skid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 19:45:11

Próbowałem wszystkich sugestii i nic nie działa na mnie.

Wyobraź sobie sytuację: potrzebujesz 2-drożnego powiązania i masz wyszukiwanie z wartościami liczb i chcesz wypełnić SELECT wartościami z tego wyszukiwania i wyróżnić wybraną opcję.

Użycie [value] lub (ngModelChange) jest niemożliwe, ponieważ nie będzie można wybrać wybranej opcji po zainicjowaniu zmiany przez użytkownika: [value] uważa wszystko za string , Jak na (ngModelChange) - oczywiście nie powinno być używane, gdy użytkownik inicjuje zmianę, więc niszczy właściwy wybór. Użycie [ngModel] gwarantuje stały format otrzymanej wartości jako INDEX: VALUE i łatwo jest ją odpowiednio przeanalizować, jednak po raz kolejny - niszczy wybraną opcję.

Więc idziemy z [ngValue] (który zajmie się odpowiednimi typami), (change) I... [value], co gwarantuje, że obsługa otrzyma wartość, a nie wyświetloną wartość lub INDEX: wartość :) Poniżej znajduje się mój rozwiązanie robocze:

  <select
    class="browser-default custom-select"
    (change)="onEdit($event.target.value)"
  >
    <option [value]="">{{
      '::Licences:SelectLicence' | abpLocalization
    }}</option>
    <ng-container *ngIf="licencesLookupData$ | async">
      <option
        *ngFor="let l of licencesLookupData$ | async"
        [ngValue]="l.id"
        [value]="l.id"
        [selected]="l.id == selected.id"
      >
        {{ l.id }} &nbsp;&nbsp; {{ l.displayName | defaultValue }}
      </option>
    </ng-container>
  </select>

  onEdit(idString: string) {
    const id = Number(idString);
    if (isNaN(id)) {
      this.onAdd();
      return;
    }
    this.licencesLoading = true;
    this.licencesService
      .getById(id)
      .pipe(finalize(() => (this.licencesLoading = false)), takeUntil(this.destroy))
      .subscribe((state: Licences.LicenceWithFlatProperties) => {
        this.selected = state;
        this.buildForm();
        this.get();
      });
  }
 1
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 00:11:18

W Kątowe 5 zrobiłem to w następujący sposób. get the object $ event.wartość zamiast $event.cel.wartość

<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);
}
 0
Author: Kumaresan Perumal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-28 08:24:17

Od angular 7 i wyżej, ponieważ ngModel jest przestarzały, możemy po prostu użyć kontrolki, aby uzyskać nową wybraną wartość bardzo łatwo w reaktywny sposób.

Przykład:

<form [formGroup]="frmMyForm">
  <select class="form-control" formControlName="fieldCtrl">
    <option value=""></option>
    <option value="val1">label val 1</option>
    <option value="val2">label val 2</option>
    <option value="val3">label val 3</option>
  </select>
</form>
this.frmMyForm.get('fieldCtrl').valueChanges.subscribe( value => {
  this.selectedValue = value;
});

Używając tego w pełni reaktywnego sposobu, możemy łatwiej uaktualnić starszą wersję aplikacji angular do nowszej.

 0
Author: HDJEMAI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-19 08:23:06