2016-11-04 13 views
16

Próbuję zbudować składnik wymienienie w Angular2 które ma elementy, kolumny i szablony dziedzinie przedmiotów od użytkownika komponentu. Tak próbuję użyć ngTemplateOutlet i ngOutletContext (które czytałem są eksperymentalne). Ale nie mogę zmusić go do działania.Nie można uzyskać ngTemplateOutlet pracować

Oto uproszczony komponent do wykazania, co próbuję zrobić:

<div *ngFor="let item of items> 
    <span *ngFor="let column of columns> 
    <template [ngOutletContext]="{ item: item }" 
       [ngTemplateOutlet]="column.templateRef"></template> 
    </span> 
</div> 

Oto Wykorzystanie składnika:

<my-component [items]="cars" [columns]="carColumns"> 
    <template #model>{{item.model}}</template> 
    <template #color>{{item.color}}</template> 
    <template #gearbox>{{item.gearbox}}</template> 
</my-component> 

A oto przykład dane:

cars = [ 
    { model: "volvo", color: "blue", gearbox: "manual" }, 
    { model: "volvo", color: "yellow", gearbox: "manual" }, 
    { model: "ford", color: "blue", gearbox: "automatic" }, 
    { model: "mercedes", color: "silver", gearbox: "automatic" } 
]; 

carColumns = [ 
    { templateRef: "model" }, 
    { templateRef: "color" }, 
    { templateRef: "gearbox" } 
]; 

Oto plunker odtwarzający problem po zaadaptowaniu kodu zgodnie z komentarzem Günters: https://plnkr.co/edit/jB6ueHyEKOjpFZjxpWEv?p=preview

+1

Czy starasz się przekazać 'TemplateRef' jako ciąg? Jeden sposób to zrobić https://plnkr.co/edit/3yM25cUVeP4fK0cxhpXp?p=preview – yurzui

+0

Innym sposobem jest użycie 'ContentChildren' https://plnkr.co/edit/2Ohj12Gax6UaK6LJ5dwD?p=preview – yurzui

+0

@yurzui Interesujące. Jak działa twoja wersja, a nie moja? Nie, kolumny muszą być listą obiektów, ponieważ przekazuję im dodatkowe informacje, takie jak nagłówek i czy obecnie powinien się wyświetlać, czy nie. Wydaje się, że jedyną różnicą między twoim plunker i moim jest to, że przekazujesz kolumny jako listę ciągów. – Hampus

Odpowiedz

20

ten sposób trzeba to zrobić:

@Component({ 
    selector: 'my-component', 
    template: ` 
    <div *ngFor="let item of items"> 
     <span *ngFor="let column of columns"> 
     <template [ngTemplateOutlet]="column.ref" [ngOutletContext]="{ item: item }"></template> 
     </span> 
    </div>` 
}) 
export class MyComponent { 
    @Input() items: any[]; 
    @Input() columns: any[]; 
} 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <my-component [items]="cars" [columns]="columns"> 
     <template #model let-item="item">{{item?.model}}</template> 
     <template #color let-item="item">{{item?.color}}</template> 
     </my-component> 
    </div>` 
}) 
export class App { 
    @ViewChild('model') model; 
    @ViewChild('color') color; 
    cars = [ 
     { model: "volvo", color: "blue" }, 
     { model: "saab", color: "yellow" }, 
     { model: "ford", color: "green" }, 
     { model: "vw", color: "orange" } 
    ]; 

    ngAfterContentInit() { 
    this.columns = [ 
     { ref: this.model }, 
     { ref: this.color ] 
    ]; 
    } 
} 

Plunker

+2

Dzięki za banda. Nie byłem daleko, ale wystarczająco daleko, by poczuć chęć uderzenia głową o ścianę. – Hampus

+1

Jestem zaskoczony, że musisz wyraźnie powiedzieć 'let-item =" item "'. Dodanie let rozwiązał podobny problem miałem. Można by pomyśleć, że to sugeruje. –

+0

{ref: this.color] tutaj nie jest nawiasami, a po zmianie 4.0

12

zmiana kątowa 5

ngOutletContext został przemianowany na ngTemplateOutletContext

Zobacz także https://github.com/angular/angular/blob/master/CHANGELOG.md#500-beta5-2017-08-29

oryginalny

Nie używaj [] i {{}} razem. Albo jeden, albo drugi, ale nie oba.

Nie używaj {{}}, jeśli chcesz przekazać obiekt, ponieważ {{}} służy do interpolacji napisów.

Powinno być

[ngTemplateOutlet]="column.templateRef" 

Plunker example

+0

Ahh, marki sens. Nadal nie działa.Teraz otrzymuję "core.umd.js: 3072 ORYGINALNY WYJĄTEK: templateRef.createEmbeddedView nie jest funkcją" – Hampus

+0

Proszę podać Plunker do odtworzenia. Trudno jest debugować za pomocą fragmentów kodu. –

+0

Dodałem plunkera. – Hampus

Powiązane problemy