2016-06-27 3 views
3

Я пытаюсь использовать ComponentResolver и ng-content вместе, однако, когда преобразователь создает компонент, транслируемый контент не отображается.Angular2 ComponentResolver и ng-content not rendering

Я использую Angular2 RC3. Я знаю, что есть некоторые предстоящие изменения, поступающие в ComponentResolver (https://github.com/angular/angular/issues/9467), которые могут повлиять на это.

import { 
    Input, 
    Component, 
    OnInit, 
    ViewContainerRef, 
    ComponentResolver, 
    ViewChild 
} from '@angular/core'; 
/** 
* COLUMN 
*/ 
@Component({ 
    selector: 'column-component', 
    template: ` 
     <div style="border:1px solid green; padding:5px;display:block;"> 
     <b>column: {{label}}</b> 
     <ng-content></ng-content> 
     </div>` 
}) 
export class ColumnComponent { 
    @Input() label: sting = ""; 
} 
/** 
* CELL 
*/ 
@Component({ 
    selector: 'cell-component', 
    template: '<b>cell component</b> <div #target></div>' 
}) 
export class CellComponent { 

    @ViewChild('target', {read: ViewContainerRef}) target; 

    constructor(
    private componentResolver:ComponentResolver, 
    private viewContainerRef: ViewContainerRef) { 
    } 

    ngOnInit() { 
    this.componentResolver.resolveComponent(ColumnComponent).then((factory) => { 
     let componentRef = this.target.createComponent(factory, 0, this.viewContainerRef.injector); 
    }); 
    } 
} 
/** 
* TABLE 
*/ 
@Component({ 
    selector: 'datatable', 
    template: ` 
     <div #target style="border:1px solid blue;padding:5px;"> 
     <b>table component</b> 
     <cell-component 
      style="border:1px solid yellow;padding:5px;display:block"> 
     </cell-component> 
     </div> 
    `, 
    directives: [ CellComponent ] 
}) 
export class TableComponent { 
} 
/** 
* ROOOT APP 
*/ 
@Component({ 
    selector: 'root-app', 
    template: ` 
     <div style="border:1px solid red;padding:5px;"> 
     <datatable> 
      <column-component [label]="'my label'"> 
      column content 
      </column-component> 
     </datatable> 
     </div> 
    `, 
    directives: [ ColumnComponent, TableComponent ] 
}) 
export class AppComponent { 

} 

Текущее поведение: Слово 'содержание столбца', которые являются содержанием column-component никогда не отображаются.

Ожидаемое поведение: Внутренний контент (слова «содержимое столбца») column-component будет отображать.


UPDATE

@ GünterZöchbauer ответил на мой orginial вопрос, однако, я применил немного больше логики и, к сожалению, это не сработало. Смотрите обновленный plunkr: https://plnkr.co/edit/CsbmY6wePC3AWZlBDy34?p=preview

Ожидаемые результаты: клетки будут повторяться для каждой строки и значения age атрибуте row «s будет транспонированная к каждому.

+0

Пожалуйста, добавьте простую демку на plunker – yurzui

+0

Что Разметка «Разметка» из? –

+0

@yurzui добавил plunkr. – amcdnl

ответ

1

Вам нужно добавить <ng-content> промежуточные компоненты, а

Plunker example

+0

Так было, но как только я применил еще одну логику, это не сработало ... см .: https: // plnkr. co/edit/CsbmY6wePC3AWZlBDy34? p = preview – amcdnl

+0

Я не могу добавить Plunker с моего телефона, но если вы используете '' с '* ngFor', это не поддерживается. –

+0

Как я и предполагал, вы пытаетесь использовать '' внутри '* ngFor'. Я думаю, вы могли бы следовать https://github.com/angular/angular/issues/8563. В качестве обходного пути вы можете использовать что-то вроде http://stackoverflow.com/questions/37676593/how-to-repeat-a-piece-of-html-multiple-times-without-ngfor-and-without-anoher-c/37676946 # 37676946 –