私は Angular 2-rc3 を使用しており、Component
トランスクルージョンを少し異なる方法で適用したいと考えています。ここに私のコンポーネントがあります:
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[];
}
そして、私はそれを次のように使用します:
<my-list [data]="cars">
<div>{{item.make | uppercase}}</div>
</my-list>
ご覧のとおり、コンポーネントで使用されるインライン テンプレートを定義しようとしています。今、これはひどく間違っています。まず、それを言うデータバインディング例外can't read property 'make' of undefined
。item.make
ではなく、周囲のコンポーネントから読み取ろうとしていMyListComponent
ます。しかし、今のところこれを一時的に無効にしても:
<my-list [data]="cars">
<div>{item.make | uppercase}</div>
</my-list>
次に、2 番目の問題が表示されます。
-- insert template here --
-- insert template here --
-- insert template here --
-- insert template here --
{item.make | uppercase}
したがって、Angular は 内で使用するためにテンプレートを実際にコピーするのではなく*ngFor
、要素をバインドするだけで、最終的に最後のアイテムに関連付けられます。
これを機能させるにはどうすればよいですか?
AngularJS でも同じ問題がありました。petebacondarwin が compile を介して DOM を操作するソリューションを投稿しましたが、これは素晴らしいことでした。コンポーネントに注入することで、Angular 2でもこのオプションを使用できますElementRef
が、! 大きな違いの 1 つは、AngularJS ではデータバインディングの前にオフになったことです。つまり、テンプレートでのcompile
使用に問題はありませんでした。{{item.make}}
Angular 2 では、{{item}}
事前に解析されているため、これは問題ないようです。では、これについて最善の方法は何ですか?わずかに異なる表記[[item]]
と文字列を使用して全体を置き換えることは、最もエレガントな方法とは思えません...
前もって感謝します!
// 編集:問題を再現するPlnkrを次に示します。