Angular2 @ get / set içeren bir özelliğe giriş


179

Şu anda bu özelliğe, yani bağlama izin vermek için kendilerine uygulanan @Input () sahip bir grup alanları var bu bileşende bir Angular2 bileşeni var

@Input() allowDay: boolean;

Ne yapmak istiyorum aslında get / set ile bir özellik bağlamak, böylece setter başka bir mantık yapabilirsiniz, aşağıdaki gibi bir şey

_allowDay: boolean;
get allowDay(): boolean {
    return this._allowDay;
}
set allowDay(value: boolean) {
     this._allowDay = value;
     this.updatePeriodTypes();
}

bunu Angular2'de nasıl yapabilirim?

Thierry Templier önerisine dayanarak değiştirdim, ancak bu hata atıyor Bilinen bir yerel özellik olmadığından 'allowDay' öğesine bağlanamıyorum:

//@Input() allowDay: boolean;
_allowDay: boolean;
get allowDay(): boolean {
    return this._allowDay;
}
@Input('allowDay') set allowDay(value: boolean) {
    this._allowDay = value;
    this.updatePeriodTypes();
}

[allowDay]="....". If the field (setter) name and the property name you want to use for binding are the same, you can omit the parameter for @Input (...) ` ye nasıl ve nerede bağlanıyorsunuz.
Günter Zöchbauer

Kabul edilen cevapta gösterildiği gibi ayarlanmış kullanma yolunu seçtiyseniz, birim testinizi nasıl ayarladığınızı merak ediyorum.
Winnemucca

1
Ne yaparsanız yapın, bir kesme noktası veya hata ayıklama ifadesi eklediğinizden veya ayarlayıcının içine yalnızca beklendiği gibi ateşlendiğinden emin olmak için sayaç oluşturduğunuzdan emin olun. Ben sadece korkunç performans ve ilginç davranış neden her değişiklik algılama çalışması için güncellenen bulundu.
Simon_Weaver

Yanıtlar:


272

@Input'u aşağıda açıklandığı gibi doğrudan ayarlayıcıda ayarlayabilirsiniz:

_allowDay: boolean;
get allowDay(): boolean {
    return this._allowDay;
}

@Input('allowDay')
set allowDay(value: boolean) {
    this._allowDay = value;
    this.updatePeriodTypes();
}

Şu plunkr'a bakın: https://plnkr.co/edit/6miSutgTe9sfEMCb8N4p?p=preview .


1
Aşağıdaki hatayı alıyorum Bilinen bir yerel özellik olmadığından 'allowDay' öğesine bağlanamıyor. Kodu tam olarak neyle değiştirdiğimi
öğrenmek

Emin misiniz? Benim için çalışıyor. Bir plunkr ekledim. Belki de direktifi directiveskullanmak istediğiniz bileşenin özelliğine eklemeyi unuttunuz ... Cevabımı güncelledim.
Thierry Templier

2
Bu kötü bir fikir çünkü ayarlayıcıyı kullanırsanız ngOnChanges ateşlenmez.
user2867288


11
UYARI : setterolacak değil (yani, vb bir dizi itme bir nesne mutasyona) referans ile bu geçirilir değerlere mutasyonlar tarafından tetiklenebilir. Yeniden tetiklenebilmesi Inputiçin bir olarak geçirilen tüm değeri değiştirmeniz gerekir setter.
Nickofthyme

61

Temel olarak yalnızca ayarlayıcıya mantık uygulamakla ilgileniyorsanız :

import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';

// [...]

export class MyClass implements OnChanges {
  @Input() allowDay: boolean;

  ngOnChanges(changes: SimpleChanges): void {
    if(changes['allowDay']) {
      this.updatePeriodTypes();
    }
  }
}

SimpleChangesHangi girdi özelliğinin değiştirildiği önemli değilse veya yalnızca bir girdi özelliğiniz varsa içeri aktarma işlemi gerekmez.

Açısal Belge: OnChanges

aksi takdirde:

private _allowDay: boolean;

@Input() set allowDay(value: boolean) {
  this._allowDay = value;
  this.updatePeriodTypes();
}
get allowDay(): boolean {
  // other logic
  return this._allowDay;
}

Sadece merak ediyorum, sadece bir setter mantığı ile ilgileniyorsanız ngOnChanges vs set özelliğini kullanmanın herhangi bir faydası var mı?
Mese

4
"NgOnChanges ile vs set kullanmıyorum" arasında bir fark yoktur @Input. Yani daha az kod gerekli.
Martin Schneider

Ups, bir yazım hatası vardı. Ama tamam, daha alakalı olabileceğini düşündüm. Tho cevap için teşekkürler :)
Mese

1
@ MA-Maddin Sanırım, aynı anda birden fazla değişiklik bekliyorsanız, her birinin çalıştırılması gereken bir rutinle sonuçlanacak bir debounced gözlemlenebilir ayarlayabilirsiniz.
Simon_Weaver

ngOnChanges yaklaşımı harika !! İyi cevap. Ayarlanan değer özel olamazsa, örneğin şablonda bağlayıcı olarak kullanılırsa, _propertyName ayarlayıcı / özel adlandırma kuralı tutarsız hale gelir. ngOnChanges alır etrafında bu mükemmel
Drenai

8

@ Paul Cavacas, ben de aynı sorunu yaşadım ve Input()dekoratörü alıcının üstüne koyarak çözdüm .

  @Input('allowDays')
  get in(): any {
    return this._allowDays;
  }

  //@Input('allowDays')
  // not working
  set in(val) {
    console.log('allowDays = '+val);
    this._allowDays = val;
  }

Bu dalma makinesine bakın: https://plnkr.co/edit/6miSutgTe9sfEMCb8N4p?p=preview


6
Bu hata beni deli etti, nihayet önce Input () tanımlamanız gerektiğini buldum (alıcı veya ayarlayıcı ama giriş dekoratörü önce gitmeli)
maxi-code

1
İşte size yardımcı olabilecek diğer referanslar https://github.com/angular/angular/issues/5477
maxi kodu

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.