2017-11-03 9 views
4

親のテンプレートを、Angularのコンポーネントの継承を使用して継承したいとします。Angular2での親コンポーネントのテンプレートの使用

イントロ

私はいくつかの基本的な構成要素を持っており、このコンポーネント(Child1ComponentChild2Component)のいくつかのチャイルズ(のはそれParentComponentを呼びましょう)。私はParentComponentにデフォルトの動作を入れて、子供のコンポーネントでこの動作をセットアップ/拡張するだけです。 ParentComponentテンプレートにはすでに必要なものがすべて含まれているので、子供のコンポーネントでこのテンプレートをデフォルトで使用するようにします。


実装の第1の変形(動作しない、Error: No template specified for component Child1Component):

@Component({ 
    selector: 'app-parent', 
    templateUrl: './app-parent.component.html', 
    styleUrls: ['./app-parent.component.scss'] 
}) 
export class ParentComponent { 
} 

@Component({ 
    selector: 'app-child1' 
}) 
export class Child1Component extends ParentComponent { 
} 


@Component({ 
    selector: 'app-child2' 
}) 
export class Child2Component extends ParentComponent { 
} 

私は親のテンプレートに子供のtemplateUrlstyleUrlsを設定できることがわかったが、それは動作します子のViewEncapsulationNoneに設定されている場合のみです。

第二の変形(それは動作しますが、私はそれを好きではない):

@Component({ 
    selector: 'app-parent', 
    templateUrl: './app-parent.component.html', 
    styleUrls: ['./app-parent.component.scss'] 
}) 
export class ParentComponent { 
} 

@Component({ 
    selector: 'app-child1', 
    templateUrl: '../parent/app-parent.component.html', 
    styleUrls: ['../parent/app-parent.component.scss'], 
    encapsulation: ViewEncapsulation.None 
}) 
export class Child1Component extends ParentComponent { 
} 

@Component({ 
    selector: 'app-child2', 
    templateUrl: '../parent/app-parent.component.html', 
    styleUrls: ['../parent/app-parent.component.scss'], 
    encapsulation: ViewEncapsulation.None 
}) 
export class Child2Component extends ParentComponent { 
} 

私は

  1. 子コンポーネントではありませんビューのカプセル化のこのソリューション原因を好きではありません。
  2. すべての子コンポーネントのテンプレートとスタイルのURLがコピー・ペーストされます。

あなたは私のこのタスクのためのよりよい解決策を提案してくださいことはできますか?

+1

私は少しアプローチを再考することをお勧めします。あなたが本当にテンプレートを継承したくない場合は、すべての子どもが同じにしたい場合は、テンプレートURLを使用して同じファイルを参照してください。異なる場合は、ng-templateを使用して、異なる部分を切り替えることができます。ここでの継承は、動作を共有する場合にのみ便利です(他の方法もあります)。テンプレートを継承し始めます。おそらく、補完物を別々に分ける必要があることを示しています。 – tam5

答えて

1

デコレータ継承の規則があるため、2番目の方法が唯一可能です。https://github.com/angular/angular/issues/11606を参照してください。

@Componentデコレータは部分的に継承することはできません。すべてまたはすべてです。

+0

本当に残念です。私はちょうど '@ Component'デコレータを掘り下げます。おそらく私は を継承したい/希望する動作を実現するためにオーバーライドすることができます。私はあなたの答えを数時間で受け入れるようにします。ちょうど他の潜在的な解決策や提案を待っています。 –

+0

おそらくJITモードで動作させることはできますが、AOTでは動作させることはできません。 – kemsky

関連する問題