부모 구성 요소의 angular2 호출 함수


85

파일을 업로드 할 수있는 업로드 구성 요소가있는 앱이 있습니다. 그것은에 포함됩니다 body.component.

업로드 할 BodyComponent.thefunction()때 부모 구성 요소의 함수 (예 :)를 사용해야합니다 ( 데이터 업데이트를위한 호출 수행). 그러나 부모가 구체적으로 body.component. 업로드는 다른 동작으로 다른 곳에서도 사용될 수 있습니다.

같은 것 parent(this).thefunction(), 어떻게할까요?

답변:


149

하위 구성 요소에 사용자 지정 이벤트를 만듭니다. 그런 것 :

@Component({
  selector: 'child-comp',
  (...)
})
export class ChildComponent {
  @Output()
  uploaded = new EventEmitter<string>();

  uploadComplete() {
    this.uploaded.emit('complete');
  }

상위 구성 요소가이 이벤트에 등록 할 수 있습니다.

@Component({
  template `
    <child-comp (uploaded)="someMethod($event)"></child-comp>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  (...)

  someMethod(event) {
  }
}

또 다른 방법은 부모 구성 요소를 자식 구성 요소에 삽입하는 것이지만 서로 강력하게 연결됩니다.


출력 정의되지 않은 오류가 발생하는 이유는 무엇입니까? 에서 가져 와서 상단의 typescript에 정의되어 있습니다 angular2/core. 콘솔 로그 쇼 angular2-polyfills 문제
PascalVKooten

오 내 대답에 오타가 있습니다. @Ouput대신 @Output. 문제 일 수 있습니다 ... 내 답변을 업데이트했습니다.
Thierry Templier 2016 년

헤, 눈치 채지 못했습니다. 그거였다.
PascalVKooten

이제 uploadComplete is not defined예제로 복사 한 메모를 얻습니다 . 부모에도 "someMethod"가 있지만 이미 uploadComplete. 부모 구성 요소는 자식 노드에서 (업로드 된) 바인딩을 사용하며 이미 자식을 지시문으로 가지고 있습니다.
PascalVKooten

4
@Component 내부의 지시문 및 파이프는 각도 RC6에서 더 이상 사용되지 않습니다.
alex351

49

아래는 최근에 나를 위해 일했습니다.

Angular5

class ChildComponent {
  @Output() myEvent = new EventEmitter<string>();

  callParent() {
    this.myEvent.emit('eventDesc');
  }
}

에서 ParentTemplate의 템플릿

<child-component (myEvent)="anyParentMehtod($event)"

3
이는 간단하고 부모가 호출 할 메서드를 결정하기 때문에 좋은 솔루션입니다. 나는 :-) 좋아
Jette

1
라우터 콘센트를 사용하는 경우 어떻게합니까? (myEvent)를 계속 사용할 수 있습니까?
로버트 윌리엄스

부모 구성 요소 내부에서 사용되는 자식 구성 요소입니다. 라우터 콘센트에 대해 잘 모르겠습니다. 이 질문이 도움이 될 수 있습니다. stackoverflow.com/questions/45949476/...
의 Shabbir Dhangot에게

33

관련 이벤트가없는 솔루션.

(원래 부모의 컨텍스트 유지)에 속하는 ChildComponent메서드를 호출하고 싶다고 가정합니다 .myMethod()ParentComponent

상위 구성 요소 클래스 :

@Component({ ... })
export class ParentComponent {

    get myMethodFunc() {
        return this.myMethod.bind(this);
    }

    myMethod() {
         ...
    }
}

상위 템플릿 :

<app-child [myMethod]="myMethodFunc"></app-child>

하위 템플릿

@Component({ ... })
export class ChildComponent {

    @Input() myMethod: Function;

    // here I can use this.myMethod() and it will call ParentComponent's myMethod()
}

1
나는 이것을 사용해 보았지만 나를 위해 작동하지 않습니다. 내 버전의 myMethod에서는 부모 구성 요소의 탭 집합을 참조합니다 (부모의 자식에서 탭을 전환하려고합니다). 부모에서 이것을 참조하면 모든 것이 작동합니다. 자식에서 myMethod로 들어가지만 탭을 변경하지는 않습니다. 그래서 나는 그것이 참조하고있는 tabset이 아이가 접근 할 때 진짜의 복사본인지 궁금합니다. this.myMethod.bind(this)반환 될 때 여기서 무슨 일이 일어나고 있는지 실제로 잘 모르겠습니다 . (아마도 내가 대신 근본적으로 뭔가를 잘못하고 있어요.)
캐서린 오스본에게

알고 있지만 8 번째 버전을 사용하고 있지 않습니다. 5 버전을 사용하는 Ionic 3에 필요합니다.
Vasilis Greece

최근에 이온 버전 (현재 4) 내가 당신을 도울 방법을 모르겠어요 @VasilisGreece,하지만 난 강력하게 업데이트하는 제안
프란체스코 Borzi

불필요한 가져 오기를 피하면서 부모의 메서드를 호출하는 가장 간단하고 직접적인 방법입니다. 2020-11-13에 Angular 10 사용. 감사합니다.
CPHPython

23

부모 구성 요소를 자식 구성 요소에 삽입 할 수 있습니다.

자세한 내용은
- 부모 구성 요소를 자식 구성 요소에 어떻게 주입합니까?를 참조하십시오 .
- 각도이 하위 구성 요소는 상위 구성 요소를 말한다 당신이 보장 할 수 있습니다이 방법은 thefunction()부모가있는 경우에만 호출됩니다 body.component.

constructor(@Host() bodyComp: BodyComponent) {

그렇지 않으면 사용하여 @Output()자식에서 부모로 의사 소통 하는 것이 좋습니다.


1
Btw, 내가해야했던 constructor(@Host() bodyComp: BodyComponent).. 아마도 최근에 바뀐 것 같다. 잘 작동합니다, thx!
Eddy Verbruggen

많은 Thanjs, 나는 혼합 뭔가 최대 - 고정
귄터 Zöchbauer에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.