Bir seçme etiketinde ngModel'deki değişikliği tespit edin (Açısal 2)


99

ngModelBir <select>etikette bir değişiklik tespit etmeye çalışıyorum . Angular 1.x'te, bunu a $watchile ngModelveya kullanarak çözebiliriz ngChange, ancak ngModelAngular 2'de bir değişikliği nasıl tespit edeceğimi henüz anlamadım .

Tam Örnek : http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info

import {Component, View, Input, } from 'angular2/core';
import {FORM_DIRECTIVES} from 'angular2/common';

@Component({
    selector: 'my-dropdown'
})
@View({
    directives: [FORM_DIRECTIVES],
    template: `
        <select [ngModel]="selection" (ngModelChange)="onChange($event, selection)" >
            <option *ngFor="#option of options">{{option}}</option>
        </select>
        {{selection}}
    `
})
export class MyDropdown {
    @Input() options;

    selection = 'Dog';

    ngOnInit() {
        console.log('These were the options passed in: ' + this.options);
  }

  onChange(event) {
    if (this.selection === event) return;
    this.selection = event;
    console.log(this.selection);
  }

}

Gördüğümüz gibi, açılır menüden farklı bir değer seçersek ngModeldeğişikliklerimiz ve görünümdeki enterpolasyonlu ifade bunu yansıtır.

Sınıfımdaki / denetleyicimdeki bu değişiklikten nasıl haberdar olabilirim?


1
ekstra yorumların bazılarını kontrol altında tutmak isteyebilirsiniz; bu sorunun kılık değiştirmiş bir rant olarak işaretlenmesini istemezsiniz. stackoverflow.com/help/dont-ask .
Claies

Yanıtlar:


238

Güncelleme :

Olay ve özellik bağlamalarını ayırın:

<select [ngModel]="selectedItem" (ngModelChange)="onChange($event)">
onChange(newValue) {
    console.log(newValue);
    this.selectedItem = newValue;  // don't forget to update the model here
    // ... do other stuff here ...
}

Ayrıca kullanabilirsiniz

<select [(ngModel)]="selectedItem" (ngModelChange)="onChange($event)">

ve sonra olay işleyicide modeli güncellemeniz gerekmez, ancak bunun iki olayın ateşlenmesine neden olduğuna inanıyorum, bu yüzden muhtemelen daha az verimli.


Beta.1'deki bir hatayı düzeltmeden önce eski cevap:

Yerel bir şablon değişkeni oluşturun ve bir (change)olay ekleyin :

<select [(ngModel)]="selectedItem" #item (change)="onChange(item.value)">

plunker

Ayrıca bkz . Angular 2'de "seçim" bölümünde yeni seçimi nasıl alabilirim?


1
Öyleyse, ngModeladında yeni bir değişkeni bağlarsam ne anlamı var item? Sarma noktası değil midir ngModelacquire olay dinleyicilerine parantez içinde, o zaman neden yeni bir değişken sunuyoruz?
lux

2
@lux, evet güzel soru. selectedItemNgModel'in bizim için otomatik olarak güncellediği bağlı verilerimizdir, ancak ... genellikle yeterince iyi olan (görünümler ve benzeri güncellemeler) değişiklikleri bize bildirmez, ancak açıkçası bu sizin kullanım durumunuz için yeterince iyi değildir. Başvurduğum diğer SO sorusunda (ngModelChange), değişikliklerden haberdar olmak için nasıl kullanmaya çalıştığımı açıkladım , ancak her değişiklik için iki kez çağrıldı. Bunun bir hata olup olmadığını bilmiyorum. Her neyse, bir (change)olay bağlama eklemek sorunu çözüyor gibi görünüyor.
Mark Rajcok

Ayrıca, yangın selectedItemçıktığında güncellenmediğini gösteren plunker'ı güncelledim onChange(), bu nedenle o yerel şablon değişkenine ihtiyacımız var gibi görünüyor.
Mark Rajcok

@lux the #veya #itembizim durumumuzda yerel bir referanstır. Bu yüzden orada yapabiliyoruz item.change.
Mark Pieszak - Trilon.io

@lux, ngModelChangeözel olaya bağlanmanın yolunu zaten açıkladım: bağlama . Sorun şu ki, <select>bu olay her değişiklik için iki kez tetikleniyor.
Mark Rajcok

12

Bu soruya rastladım ve oldukça iyi kullandığım ve çalıştığım cevabımı göndereceğim. Filtrelenen bir arama kutusu ve nesneler dizisi vardı ve arama kutumda(ngModelChange)="onChange($event)"

benim .. De .html

<input type="text" [(ngModel)]="searchText" (ngModelChange)="reSearch(newValue)" placeholder="Search">

sonra benim component.ts

reSearch(newValue: string) {
    //this.searchText would equal the new value
    //handle my filtering with the new value
}

5
İle birleştirme sırasında Bilginize, ngModelChange, $eventDOM değildir Olay . Daha ziyade, bir giriş öğesi için bir dize olan form öğesinin geçerli değeridir.
Mark Rajcok

@MarkRajcok lütfen bana bunun için dokümantasyonu gösterir misiniz, böylece geliştirici ekibimin geri kalanıyla paylaşabilirim?
Neil S

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.