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 현재 콘솔이 인쇄되는 방식이 정확합니다 .. 직면 한 문제는 무엇입니까?
Pankaj Parkar

6
나는 현재 문제에 직면하지 않고 의도 된 행동에 대한 설명을 찾고 있습니다. 호기심에 대한 답을 찾지 못했을 때, 나는 다른 사람들이 같은 명확성을 원할 경우 질문하기로 결정했습니다.
Bryan Rayner

귀하의 예제에서 당신은 @Input에 괄호 () 누락
kitimenpolku

답변:


142

흥미로운 주제입니다. 당신은 어떻게 작동하는지 알아 내기 위해 두 개의 라이프 사이클 후크 함께 놀러 수 ngOnChangesngOnInit.

기본적으로 기본값을로 설정하면 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

정의 된 property값 없이 HTML에 포함 된 구성 요소

결과적으로 콘솔에서 볼 수 있습니다. Init default

그것은 의미 onChange가 트리거되지 않았습니다. 초기화가 트리거되었으며 property값이 default예상대로입니다.

상황 2

setted 속성이있는 html에 포함 된 구성 요소 <cmp [property]="'new value'"></cmp>

결과적으로 콘솔에서 볼 수 있습니다.

Changed new value Object {}

Init new value

그리고 이것은 흥미 롭습니다. 첫째 트리거 된 onChange잘 살고 후크, propertynew value, 그리고 이전 값이었다 빈 객체 ! 그리고 그 onInit후크가 새 값으로 트리거 된 후에 만 property.


8
이 동작에 대한 공식 문서에 대한 링크가 있습니까? 이것의 논리와 추론을 이해하는 것이 좋을 것이며 버전별로 동작이 무엇인지 추적 할 수 있습니다.
Bryan Rayner

나는 그러한 정보를 보지 못했습니다. 위의 모든 것은 내 조사입니다. 당신의 js 파일을 컴파일 읽기한다면 나는 당신이 더 많은 답을 찾을 수 있다고 생각
미키

1
나는 @Input기본값을 갖는 것에 대한 문서를 찾고 있었다 . @slicepan에는 구성 요소 수명주기에 대한 문서에 대한 링크가 있지만 문서에 사용 된 기본값이 표시되지 않았습니다.
nycynik

@nycynik 단순히 디폴트 값이 사용@Input() someProperty = 'someValue';
magikMaker

1
당신은 생명의 은인입니다. AngularJS와 응용 프로그램에서 각도 7.x의로 업그레이드하는 동안이 내 머리에 상처를 만든
안드리

9

여기에 가장 적합한 솔루션이 있습니다. (ANGULAR 모든 버전)

주소 지정 솔루션 : @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);
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.