Як встановити значення за замовчуванням для властивостей компонента Angular 2?


101

Як під час написання компонентів Angular 2.0 як встановлюються значення за замовчуванням для властивостей?

Наприклад - я хочу встановити fooзначення 'bar'за замовчуванням, але прив'язка може негайно вирішити до 'baz'. Як це відтворюється на гачках життєвого циклу?

@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);
    }
}

Беручи до уваги наступні шаблони, саме такими, я думаю, будуть значення. Я помиляюся?

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

Увійшли в консоль:

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

Увійшли в консоль:

'bar'
undefined
undefined

Що відбувається, коли ви спробуєте?
JB Nizet

1
@BryanRayner те, як зараз друкуються консолі, є правильним .. з якою проблемою ви стикаєтесь?
Панкадж Паркар

6
В даний час я не стикаюся з проблемою, я просто шукаю роз'яснення щодо передбачуваної поведінки. Коли я не знайшов відповіді на свою цікавість, я вирішив поставити запитання на випадок, якщо б інші мали таке ж бажання ясності.
Брайан Рейнер,

У вашому прикладі вам не вистачає дужок на @Input ()
kitimenpolku

Відповіді:


142

Це цікава тема. Ви можете пограти з двома гачками життєвого циклу, щоб зрозуміти, як це працює: ngOnChangesі ngOnInit.

В основному, коли ви встановлюєте значення за замовчуванням Input, це означає, що воно буде використовуватися лише у випадку, якщо значення цього компонента не надходить. І цікава частина буде змінена до ініціалізації компонента.

Скажімо, у нас є такі компоненти з двома гачками життєвого циклу та однією властивістю, що надходить 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);
  }

}

Ситуація 1

Компонент, включений у html без визначеного propertyзначення

Як результат ми побачимо в консолі: Init default

Це означає, що onChangeце не спрацьовувало. Ініціювання було запущено, і propertyзначення defaultвідповідає очікуваному.

Ситуація 2

Компонент, що входить до html із встановленим властивістю <cmp [property]="'new value'"></cmp>

Як результат ми побачимо в консолі:

Changed new value Object {}

Init new value

І цей цікавий. Спочатку був запущений onChangeхук, який встановлено propertyна new value, а попереднє значення було порожнім об'єктом ! І лише після цього onInitгачок був спрацьований з новим значенням property.


8
Чи є посилання на офіційні документи для такої поведінки? Було б добре зрозуміти логіку та міркування цього, а також мати можливість відстежувати поведінку кожної версії.
Bryan Rayner

Я не бачив такої інформації, все вище - це моє власне розслідування. Думаю, ви зможете знайти більше відповідей, якщо будете читати скомпільовані файли js
Міккі

1
Я шукав документацію щодо @Inputзначень за замовчуванням. @slicepan має посилання на документи життєвого циклу компонента, але я не побачив значення за замовчуванням, яке використовується в документації.
nycynik

@nycynik просто використовує це для значень за замовчуванням:@Input() someProperty = 'someValue';
magikMaker

1
Ти рятівник. Від цього боліла голова, коли я
Андріс

9

Ось найкраще рішення для цього. (ANGULAR All Version)

Рішення для адресації : Щоб встановити значення за замовчуванням для змінної @Input . Якщо жодне значення не передається цій вхідній змінній, тоді воно прийме значення за замовчуванням .

Я запропонував рішення подібного типу подібного питання. Ви можете знайти повне рішення тут

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);
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.