2017-02-17 10 views
-1

ちょっと私は角度2を初めて使っています。私は先週、角度2で試して、動的なテンプレートと動的なスタイルで動的コンポーネントを生成できるかどうか疑問に思いました。これは、角2でそれを行うことが可能であるfollwoingは私が(例えば、これは任意のヘルプが理解されるであろう角度1.動的なコンポーネントを角2で作成する

に多分可能であることをEscpeciallyのplunkersを覚えて、この

@Component({ 
    // 2a 
    selector: 'dynamic placeholder', 

    // 2b 
    styles: [`dynamic styles`] 

    // 2c 
    template: `dynmic template` 
}) 

のようにあるべきであることを意味しますComponentFactoryResolverを使用してみてください:ここで

@NgModule({ 
    imports: [BrowserModule], 
    declarations: [AppComponent], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { 
} 

@Component({ 
    selector: 'my-app', 
    template: ` 
     <div>Hello, world!</div> 
    ` 
}) 
export class AppComponent { 
} 

@NgModule({ 
    declarations: [HomeComponent], 
    exports: [HomeComponent] 
}) 
export class HomeModule { 
} 

@Component({ 
    selector: 'home', 
    template: ` 
     <div>This is home</div> 
    ` 
}) 
export class HomeComponent { 
} 

@Component({ 
    selector: 'hello-world', 
    template: ` 
     <div> 
      Hello, world!, {{name}} 
      The answer is: {{getAnswer()}} 
     </div> 
    ` 
}) 

export class HelloWorldComponent implements AfterViewInit { 
    private name:string = 'You'; 

    constructor(private helloWorldService: HelloWorldService) { 
    } 

    ngAfterViewInit(): void { 
     this.name = 'Me'; 
    } 

    private getAnswer() { 
     return this.helloWorldService.giveMeTheAnswer(); 
    } 
} 

@NgModule({ 
    declarations: [HomeComponent, HelloWorldComponent], 
    providers: [HelloWorldService], 
    exports: [HomeComponent] 
}) 
export class HomeModule { 
} 

@Component({ 
    selector: 'home', 
    template: ` 
     <button (click)="sayHello()">Say hello</button> 
     <div>This is home</div> 
    ` 
}) 

export class HomeComponent { 
    constructor(private componentFactoryResolver: ComponentFactoryResolver, 
       private viewContainerRef: ViewContainerRef) { 
    } 

    private sayHello() { 
     const factory = this.componentFactoryResolver.resolveComponentFactory(HelloWorldComponent); 
     const ref = this.viewContainerRef.createComponent(factory); 
     ref.changeDetectorRef.detectChanges(); 
    } 
} 

を作成することができますplunkerあるシンプルコード)

とこれは私がこれまでに達成したものです(私は機能が2.4でリリースされていることを信じて活字体とAngular2の最新バージョンでは http://plnkr.co/edit/ZXsIWykqKZi5r75VMtw2?p=preview

+2

StackOverflowは、あなたにコードを書くように人々に依頼する場所ではありません。私があなたが試みたことを見せて、確かな努力をしてください。 –

+0

私は正しい方法でアップロードします。コードは動作しません。 – Brk

+1

このスレッドを閉じるのではなく、お互いを助けてください。私は角度2でこのトピックが可能であるかどうかを理解しようとすることに頑強に努力しています。角度2に移行したり、使用したりしません。 私はインターネットで私の例を渡しましたが、私の場合は確かな答えはありません。 – Brk

答えて

1

:動的なCSSを作成することが可能である場合、私は知らない、いくつかは、私は私の質問に答えることができる場合は、動的コンポーネントは、私は嬉しくなります.0)1つの基本コンポーネントを作成し、それを拡張することができます。プロパティのすべてのデコレータ/注釈(@Input/@Output/@ViewChild)がコピーされます。ただし、祖先ごとに@Componentのプロパティを指定する必要があります。つまり、selectorだけを上書きすることはできません。それは正しいアプローチです。

もう1つのアプローチ - >コンポーネントクラスのデコレータを更新するにはreflect-metadataを使用します(この場合、1つのプロパティを上書きすることができます)。exportコンポーネントの中で使用されているコンポーネント/ディレクティブ/サービスを上書きします。たとえば、いくつかのライブラリには複数のコンポーネントがあり、その中には内部でのみ使用されるものがあります(通常の方法でモジュールにインポートする方法はありませんが、providersを試してみてください)。あなたが "上書き"しようとすると、reflect-metadataというCSSがあり、 "内部"のものを解決できないので、内部のコンポーネント - > angular/typescriptがクラッシュします。この回答で始めることができます:StackOverflow

+0

クイックアンサーのおかげでありがとうございましたが、添付された回答に賛成し、メタデータが継承のためのものであり、動的コンポーネントを作成するものではないことがわかりました。 – Brk

+0

私はあなたに正しい解説を得ましたが、私は、メタデータを反映するようなツールをどのように使うかを明確にした例を探しています。 – Brk

+0

あなたの質問に間違いがあります。私はあなたが、その場でコーディングするのではなく、コンポーネント間で共通の機能を共有したいと思っていました)。 –

関連する問題