Angular 2 bileşen özellikleri için varsayılan değerler nasıl ayarlanır?


102

Angular 2.0 bileşenleri yazarken, özellikler için varsayılan değerler nasıl ayarlanır?

Örneğin - Sette istiyorum fooiçin 'bar'varsayılan olarak, ancak bağlayıcı kudreti derhal çözümlemek 'baz'. Yaşam döngüsü kancalarında bu nasıl oynanır?

@Component({  
    selector: 'foo-component'
})
export class FooComponent {
    @Input()
    foo: string = 'bar';

    @Input()
    zalgo: string;

    ngOnChanges(changes){
          console.log(this.foo);
          console.log(changes.foo ? changes.foo.previousValue : undefined);
          console.log(changes.foo ? changes.foo.currentValue : undefined);
    }
}

Aşağıdaki şablonlar göz önüne alındığında, değerlerin olmasını beklediğim budur. Yanlış mıyım?

<foo-component [foo] = 'baz'></foo-component>

Konsolda oturum açıldı:

'baz'
'bar'
'baz'
<foo-component [zalgo] = 'released'></foo-component>

Konsolda oturum açıldı:

'bar'
undefined
undefined

Denediğin zaman ne olur?
JB Nizet

1
@BryanRayner şu anda konsolların basılma şekli doğru ... Karşılaştığınız sorun nedir?
Pankaj Parkar

6
Şu anda bir sorunla karşı karşıya değilim, sadece amaçlanan davranış hakkında açıklama istiyorum. Merakımın cevabını bulamayınca, başkalarının da aynı açıklık arzusu duyması durumunda soruyu sormaya karar verdim.
Bryan Rayner

Örneğinizde @Input ()
kitimenpolku 19'16

Yanıtlar:


143

Bu ilginç bir konu. Nasıl çalıştığını anlamak için iki yaşam döngüsü kancasıyla oynayabilirsiniz: ngOnChangesve ngOnInit.

Temel olarak, varsayılan değeri olarak ayarladığınızda Input, bu, yalnızca o bileşende hiçbir değer gelmeyeceği durumda kullanılacağı anlamına gelir. Ve ilginç kısım, bileşen başlatılmadan önce değiştirilecek.

Diyelim ki iki yaşam döngüsü kancasına ve bir özelliğinden gelen bu tür bileşenlerimiz var input.

@Component({
  selector: 'cmp',
})
export class Login implements OnChanges, OnInit {
  @Input() property: string = 'default';

  ngOnChanges(changes) {
    console.log('Changed', changes.property.currentValue, changes.property.previousValue);
  }

  ngOnInit() {
    console.log('Init', this.property);
  }

}

Durum 1

Tanımlanmış propertydeğer olmadan html'ye dahil edilen bileşen

Sonuç olarak konsolda göreceğiz: Init default

Bu onChangetetiklenmedi demek . Init tetiklendi ve propertydeğer defaultbeklendiği gibi.

Durum 2

Ayarlanmış özelliğe sahip html'ye dahil bileşen <cmp [property]="'new value'"></cmp>

Sonuç olarak konsolda göreceğiz:

Changed new value Object {}

Init new value

Ve bu ilginç. Öncelikle tetiklenen oldu onChangesetted kanca, propertyiçin new valueve önceki değer boş nesne ! Ve ancak bu onInitkanca yeni değeri ile tetiklendikten sonra property.


9
Bu davranış için resmi belgelere herhangi bir bağlantı var mı? Bunun arkasındaki mantığı ve mantığı anlamak iyi olur, ayrıca sürüme göre davranışın ne olduğunu da takip edebilmek.
Bryan Rayner

Ben böyle bir bilgi görmedim, her şey benim kendi araştırmam. Derlenmiş js dosyalarını okursanız daha fazla cevap bulabileceğinizi düşünüyorum
Mikki

1
@InputVarsayılan değerlere sahip olduğuna dair dokümantasyon arıyordum . @slicepan'ın bileşen yaşam döngüsü için dokümanlara bir bağlantısı var, ancak dokümantasyonda kullanılan varsayılan bir değer görmedim.
nycynik

@nycynik bunu varsayılan değerler için kullanın:@Input() someProperty = 'someValue';
magikMaker

1
Sen cankurtaransın. Bu, AngularJS uygulamasından Angular 7.x'e yükseltme yaparken başımı ağrıttı
Andris

9

İşte bunun için en iyi çözüm. (ANGULAR Tüm Sürüm)

Adresleme çözümü : @Input değişkeni için varsayılan bir değer ayarlamak için . Bu giriş değişkenine hiçbir değer geçilmezse , o zaman varsayılan değeri alır .

Bu tür benzer sorulara çözüm getirdim. Tam çözümü buradan bulabilirsiniz

export class CarComponent implements OnInit {
  private _defaultCar: car = {
    // default isCar is true
    isCar: true,
    // default wheels  will be 4
    wheels: 4
  };

  @Input() newCar: car = {};

  constructor() {}

  ngOnInit(): void {

   // this will concate both the objects and the object declared later (ie.. ...this.newCar )
   // will overwrite the default value. ONLY AND ONLY IF DEFAULT VALUE IS PRESENT

    this.newCar = { ...this._defaultCar, ...this.newCar };
   //  console.log(this.newCar);
  }
}
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.