2016-06-15 7 views
0

ベースパネルを表すコンポーネント(HTMLテンプレート付き)を作成したいと思います。次に、この基本クラスを継承したいが、タイトル(クラス属性/関数または@Input)とコンテンツ(または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を含む@rinukusuの溶液が働いています。

しかし、BasePanelコンポーネントを作成して派生コンポーネントテンプレートをデコレートする可能性があります。

+0

派生したコンポーネントテンプレートをどのように飾るのか分かりません。 "手段。もう少し詳しく教えていただけますか? –

+0

@GünterZöchbauerコンポーネントでは、パネルコンテンツ(変数など)にのみHTMLを追加したいと思います。これは、埋め込み、余白、境界線などを宣言するHTMLによって装飾されます。好ましくは、この装飾は 'BasePanel'によって行われますが、このような考え方はPHPに由来します。 – koral

+0

以下に説明する ' 'のようなサウンドは正しいものです。 –

答えて

1

角度は拡張コンポーネントをサポートしていません。 In Angularコンポジションは継承よりも優先されます。それをサポートするカスタムデコレータを提案する回答がありますが、それは今後のオフラインテンプレートコンパイラと互換性がありません。

+0

より弾性的なアプローチであるため、継承を超えて合成を優先するのが全体的な傾向です。しかし、ビジュアルデコレータを適用する最良の方法は何ですか?今後のオフラインテンプレートコンパイラとDRYを念頭に置いて、周辺のHTMLタグではなく、パネルの内容(プロジェクトにはたくさんあります)だけを作成するコードを整理する方法は?タイトルとコンテンツデコレータの開始とコンテンツデコレータの終了を持つヘッダのサブコンポーネントを作成し、すべてのパネルでこれらのコンポーネントを使用できます。私は何年も前にPHPでこのようにしていましたが、その後の技術は盛んになりました。 – koral

2

継承はこれでは機能しませんが、元のHTMLを表示するようにng-contentタグを利用することができます。

成分:

@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

私は言ったように、これはうまくいかず、ギュンターが答えて言ったように。 – rinukkusu

関連する問題