【发布时间】:2016-04-19 21:56:46
【问题描述】:
假设我有这个简单的列表渲染组件:
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)。如果我尝试绑定到 click 事件,就像我在组件的第一个版本中所做的那样,Angular 会抛出以下异常:
"Event binding click not emitted by any directive on an embedded template"
这是plunker showing that。您可以删除点击绑定,它会工作。
我该如何解决这个问题?我只是希望用户能够为我将通过 ngFor 迭代的从属项指定一个模板,但我需要能够将处理程序绑定到这些项。
【问题讨论】:
-
嗯,这是一个很好的...有一点值得注意 - 你的笨蛋都在使用 beta-8,它已经过时了大约 2 个月。更新到最新版本(beta-15)并不能修复错误,但我仍然建议这样做
标签: angular