mit Sagen wir, ich diese einfache Liste Rendering Komponente haben:Bindungsereignisse, wenn ein ngForTemplate in Angular 2
import {Input, Component } from 'angular2/core'
@Component({
selector: 'my-list',
template: `
<div *ngFor='#item of items' (click)='onItemClicked(item)'>
{{item}}
</div>
`
})
class MyList {
@Input() items: string[];
onItemClicked(item) { console.log('Item clicked:', item); }
}
ich es wie folgt verwendet werden:
<my-list [items]='myAppsItems'></my-list>
So weit so gut.
Weiter Ich entscheide, ich möchte der Benutzer in der Lage sein seine eigene Vorlage für die gerenderten Elemente zu liefern, so dass ich ändern Sie die Komponente
@Component({
selector: 'my-list',
template: `
<template ngFor [ngForOf]="items" [ngForTemplate]="userItemTemplate" (click)='onItemClicked(item)'>
</template>
`
})
class MyList {
@Input() items: string[];
@ContentChild(TemplateRef) userItemTemplate: TemplateRef;
onItemClicked(item) { console.log('Item clicked:', item); }
}
Und es wie folgt verwenden:
<my-list [items]='items'>
<template #item>
<h1>item: {{item}}</h1>
</template>
</my-list>
Diese funktioniert nur Ich binde keine Event-Handler an die Listenelemente (plunker). Wenn ich das Click-Ereignis zu binden versuchen, wie ich in der ersten Version der Komponente hat, wirft Angular die folgende Ausnahme:
"Event binding click not emitted by any directive on an embedded template"
hier ein plunker showing that ist. Sie können die Klickbindung löschen und es funktioniert.
Wie behebe ich das? Ich möchte nur, dass der Benutzer in der Lage ist, eine Vorlage für ein untergeordnetes Element anzugeben, das ich über ngFor iterieren werde, aber ich muss in der Lage sein, Handler an diese Elemente zu binden.
Hmm, das ist ein gutes ... eine Sache, erwähnenswert - Ihre plunks beide unter Verwendung von beta-8, die ~ 2 Monate veraltet ist. Aktualisierung auf die neueste (beta-15) nicht beheben den Fehler, aber ich würde trotzdem vorschlagen http tun es – drewmoore