2016-09-20 5 views
2

상위 구성 요소에서 ng2 부트 스트랩 모달을 열려고합니다. ModalComponent를 만들고 "exportAs : child"를 만들었습니다. 내 ModalComponent는angular2 : 상위 구성 요소의 열린 ng2-bootstrap 모달

import { Component, Input, ViewChild } from '@angular/core'; 
import { ModalDirective } from 'ng2-bootstrap/ng2-bootstrap'; 

@Component({ 
    selector: 'modal', 
    moduleId: module.id, 
    templateUrl: 'modal.component.html', 
    styleUrls: ['modal.component.css'], 
    exportAs: 'child' 
}) 
export class ModalComponent { 

    @ViewChild('childModal') public childModal:ModalDirective; 

    public show(variant):void { 

     console.log(this.childModal); 
     this.childModal.show(); 
    } 

    public hide():void { 

     this.childModal.hide(); 
    } 
} 

처럼 보인다 나는

<modal #c="child"></modal> 

로 부모 템플릿의 모달을 포함 ... 내가 공격

<button type="button" class="btn btn-primary" (click)="c.show(variant)">open</button> 

으로 부모 템플릿에서 부르는 " modalComponent 내부에서 "show"메서드를 제대로 사용할 수 있지만 "childModal"값은 항상 정의되지 않습니다 (Nb : console.log() 문).

모든 포인터는 크게 감사하겠습니다.

+0

'modal.component.html' 파일을 게시 할 수 있습니까? 그리고이 plunker을 확인 https://plnkr.co/edit/951NyF20qXudDtZo5OAx?p=preview – yurzui

+0

고마워! 나는 당신의 plunker를 훑어 보았고 당신이 의심 할 때 나의 실수가 HTML에 있다는 것을 발견했다. 나는 아래의 해결책을 쓸 것이다. – prime

+0

@yurzui 오늘 플러 커가 작동하지 않아서, * ng2-bootstrap *이 '

2

제 생각에는 구성 요소와 쿼리 모달 인스턴스를 통과해야하는 모달 API는 최적이 아닙니다. 훨씬 더 나은 접근법은 서비스로서 모달을 갖는 것입니다. 이 방법으로 코드의 임의의 위치 (서비스, 예 : 로그인 서비스 포함)에서 모달로 open 메소드를 호출 할 수 있습니다.

이것은 정확히 모달 용 API가 https://ng-bootstrap.github.io/#/components/modal의 서비스로 모델링 된 이유입니다. 이 도구를 사용하면 modalService.open(....)을 수행하여 의 임의의 위치에서 모달을 호출 할 수 있습니다.

참고로, modals에 대한 서비스 기반 접근법은 다른 Angular2 위젯 라이브러리 (예 : 머티리얼 디자인)에도 있습니다.

요약하면 사용중인 API를 다시 고려하십시오.

+0

전적으로 동의합니다. 나는 ng2-bootstrap을 사용하고 있었지만 대부분의 다른 라이브러리가 모달 서비스를 제공하는 방식에 반대하여 저를 혼란스럽게 만들었습니다. – GFoley83

관련 문제