Скажем, у меня есть этот простой компонент рендеринга списка:
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); }
}
Я использую его следующим образом:
<my-list [items]='myAppsItems'></my-list>
Пока все хорошо.
Далее я решил, что хочу, чтобы пользователь мог предоставить свой собственный шаблон для отображаемых элементов, поэтому я меняю компонент
@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); }
}
И используйте его следующим образом:
<my-list [items]='items'>
<template #item>
<h1>item: {{item}}</h1>
</template>
</my-list>
Это работает только я не привязываю никаких обработчиков событий к элементам списка (plunker). Если я попытаюсь привязать событие клика, как это было в первой версии компонента, Angular выдает следующее исключение:
"Event binding click not emitted by any directive on an embedded template"
Здесь plunker показывает, что. Вы можете удалить привязку кликов, и она будет работать.
Как это исправить? Я просто хочу, чтобы пользователь мог указать шаблон для подчиненного элемента, который я собираюсь перебирать через ngFor, но мне нужно иметь возможность привязывать обработчики к этим элементам.