2016-06-15 5 views
0

기본 패널을 나타내는 구성 요소 (HTML 템플릿 포함)를 만들고 싶습니다. 그런 다음이 기본 클래스를 상속하지만 제목 (클래스 특성/함수 또는 @Input)과 내용 (template 또는 templateUrl@Component 데코레이터로 지정) 만 지정하고 싶습니다.Angular2 : 기본 구성 요소 - 제목과 내용이있는 패널

@Component({ 
    template: ` 
     <div class="panel"> 
      <div class="title">{{title}}</idv> 
      <div class="content">???</div> 
     </idv> 
    ` 
}) 
export class BasePanel { 
    @Input() 
    protected title: string = ''; 
} 

@Component({ 
    selector: 'my-panel', 
    template: `MyPanel template - lorem ipsum` 
}) 
export class MyPanel extends BasePanel { 
    title: string = 'MyPanel title'; 
} 

다음 다른 템플릿 :

<my-panel></my-panel> 

또는

<my-panel title="My better panel"></my-panel> 

매우 좋은 솔루션은 HTML 태그 사이에 콘텐츠를 제공하는 것입니다 :

<my-panel title="My panel with content"> 
    <p>Lorem ipsum dolor sit amet,</p> 
    <p>consectetur adipiscing elit.</p> 
</my-panel> 

편집 1

ng-content가 포함 된 @rinukkus의 용액이 효과적입니다.

하지만 파생 된 구성 요소 템플릿을 장식하는 BasePanel 구성 요소를 만들 수있는 가능성이 있습니다.

+0

파생 된 구성 요소 템플릿을 꾸미는 것이 무엇인지 "나는 모른다." 방법. 조금 더 자세히 설명해 주시겠습니까? –

+0

@ GünterZöchbauer 구성 요소에서 (변수 등을 포함한) 패널 내용에만 HTML을 붙이고 싶습니다. 그리고 이것은 패딩, 여백, 테두리 등을 선언하는 HTML로 장식됩니다 - 응용 프로그램의 모든 패널에 대해 동일한 장식. 가급적이 꾸미는 것은'BasePanel'에 의해 이루어질 것입니다 - 그러나 이런 생각은 PHP에서옵니다. – koral

+0

아래에 설명 된 ''과 같은 소리가 올바른 사용법입니다. –

답변

1

각도는 확장 구성 요소를 지원하지 않습니다. In Angular composition은 상속보다 선호됩니다. 사용자 지정 데코레이터를 지원하는 제안이 있지만 곧 오프라인 템플릿 컴파일러와 호환되지 않는 대답이 있습니다.

+0

상속에 비해 컴포지션 우선 순위가 높을수록 전반적인 경향입니다. 하지만 시각적 데코레이터를 적용하는 최선의 방법은 무엇입니까? 어떻게하면 패널의 내용 만 (프로젝트가 많음) 만들고 주변 HTML 태그는 곧 오프라인 템플릿 컴파일러와 DRY를 염두에 두지 않고 코드를 구성 할 수 있습니까? 제목과 컨텐트 데코레이터 시작 및 컨텐트 데코레이터 끝이있는 머리글에 대한 하위 구성 요소를 만들고 모든 구성 요소에서 해당 구성 요소를 사용할 수 있습니다. 필자는 PHP에서 수년 전부터 이렇게하고 있었고 나중에는 기술이 발달했습니다. – koral

2

상속은 작동하지 않지만 ng-content 태그를 활용하면 원본 HTML을 표시 할 수 있습니다.

구성 요소 :

@Component({ 
    selector: 'my-panel', 
    template: ` 
     <div class="panel"> 
      <div class="title">{{title}}</div> 
      <div class="content"><ng-content></ng-content></div> 
     </div> 
    ` 
}) 
export class MyPanel { 
    @Input() 
    protected title: string = ''; 
} 

사용법 :

<my-panel title="My panel with content"> 
    <p>Lorem ipsum dolor sit amet,</p> 
    <p>consectetur adipiscing elit.</p> 
</my-panel> 

작업 Plunker 사용 예제

+0

이것은 HTML 태그 사이에 내용을 전달하기위한 좋은 해결책입니다. 그러나 파생 된 구성 요소 템플릿을 꾸미는 BasePanel 구성 요소를 만들 수 있습니다. – koral

+0

내가 말했듯이 귄터 (Günter)가 대답했다. – rinukkusu

관련 문제