Używam Angular 2-rc3 i mam Component
i chcę zastosować transclusion, tylko w nieco inny sposób. Oto mój komponent:Komponent transclude with inline template
import { Component, Input } from '@angular/core';
@Component({
selector: 'my-list',
template: `<ul>
<li *ngFor="let item of data">
-- insert template here --
<ng-content></ng-content>
</li>
</ul>`
})
export class MyListComponent {
@Input() data: any[];
}
i używam go tak:
<my-list [data]="cars">
<div>{{item.make | uppercase}}</div>
</my-list>
Jak widać, próbuję zdefiniować szablon inline, który będzie używany przez mojego składnika. Teraz to idzie strasznie źle. Po pierwsze, wyjątek dotyczący wiązania danych, który mówi: can't read property 'make' of undefined
. Próbuje odczytać item.make
z mojego otoczenia, a nie z MyListComponent
. Ale nawet jeśli tymczasowo wyłączyć to teraz:
<my-list [data]="cars">
<div>{item.make | uppercase}</div>
</my-list>
Potem pojawia się drugi problem:
-- insert template here --
-- insert template here --
-- insert template here --
-- insert template here --
{item.make | uppercase}
Więc kątowa faktycznie nie skopiować szablon do użytku w *ngFor
, to po prostu wiąże elementy i kojarzą się z ostatnim elementem.
Jak to działa?
Miałem ten sam problem z AngularJS, gdzie petebacondarwin posted a solution to manipulate the DOM through compile, który był świetny. Mam tę opcję również w Angular 2, wstrzykując ElementRef
w moim komponencie, ale! Jedną z dużych różnic jest to, że compile
w AngularJS zakończyło się przed databindingiem, co oznacza, że nie było problemów z użyciem szablonu w szablonie {{item.make}}
. W przypadku Angular 2 wygląda na to, że nie można przejść od razu, ponieważ {{item}}
jest analizowany wcześniej. Więc jaki jest najlepszy sposób, aby to osiągnąć? Używanie nieco innej notacji [[item]]
i ciąg zastępujący całą rzecz nie wydaje się najbardziej eleganckim sposobem ...
Z góry dziękuję!
// Edytuj: Oto Plnkr, który odtwarza problem.
Byłoby wspaniale mieć Plunkera, który pozwala na odtworzenie, gdzie wszystko jest na miejscu, w jaki sposób chcesz z niego korzystać. Ciężko mi, na przykład, dowiedzieć się, co znaczy "wstawić szablon tutaj". –
Dodano! Dzięki. –
@JPtenBerge Miałem podobny problem i [znalazłem rozwiązanie] (http://stackoverflow.com/questions/38174837/how-to-create-a-component-witha-a-dynamic-template-component-transclude- z in-in) – Ross