Powiedzmy mam ten prosty składnik lista renderingu:wiążące wydarzenia przy zastosowaniu ngForTemplate kątowej 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); }
}
używam go tak:
<my-list [items]='myAppsItems'></my-list>
tej pory tak dobrze.
Następny zdecyduję chcę użytkownika, aby być w stanie dostarczyć swój własny szablon dla świadczonych przedmiotów, więc mogę zmienić komponent
@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); }
}
i używać go tak:
<my-list [items]='items'>
<template #item>
<h1>item: {{item}}</h1>
</template>
</my-list>
ten działa tylko Nie wiążę żadnych programów obsługi zdarzeń z elementami listy (plunker). Gdy próbuję wiązać zdarzenia click, jak ja w pierwszej wersji komponentu, kątowe rzuca następujący wyjątek:
"Event binding click not emitted by any directive on an embedded template"
Oto plunker showing that. Możesz usunąć wiązanie kliknięć i będzie działać.
Jak to naprawić? Po prostu chcę, aby użytkownik mógł określić szablon dla podrzędnego elementu, który zamierzam iterować przez ngFor, ale muszę mieć możliwość powiązania procedur obsługi tych elementów.
Hmm, to jest dobre ... jedna rzecz warta odnotowania - twoje plunki używają beta-8, która jest ~ 2 miesiące nieaktualna. Aktualizacja do najnowszej wersji (beta-15) nie naprawia błędu, ale mimo to sugeruję zrobienie tego. – drewmoore