gpt4 book ai didi

angular - 在 Angular 2 中使用 ngForTemplate 时绑定(bind)事件

转载 作者:太空狗 更新时间:2023-10-29 16:58:17 25 4
gpt4 key购买 nike

假设我有这个简单的列表呈现组件:

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>

这仅适用于我没有将任何事件处理程序绑定(bind)到列表项 (plunker)。如果我尝试绑定(bind)到点击事件,就像我在组件的第一个版本中所做的那样,Angular 会抛出以下异常:

"Event binding click not emitted by any directive on an embedded template"

这是一个 plunker showing that .您可以删除点击绑定(bind),它会起作用。

我该如何解决这个问题?我只希望用户能够为我将通过 ngFor 迭代的从属项目指定一个模板,但我需要能够将处理程序绑定(bind)到这些项目。

最佳答案

一个星期以来我一直在寻找这个问题的答案,我终于想出了一个相当不错的解决方案。我建议不要使用 ngForTemplate,而是使用 ngTemplateOutlet。

这里已经很好地描述了: angular2 feeding data back to `<template>` from `[ngTemplateOutlet]`

列表项的自定义模板放置在组件标签之间:

<my-list>
<template let-item="item">
Template for: <b>{{item.text}}</b> ({{item.id}})
</template>
</my-list>

和组件模板:

<ul>
<li *ngFor="let item of listItems" (click)="pressed(item)">
<template
[ngTemplateOutlet]="template"
[ngOutletContext]="{
item: item
}">
</template>
</li>
</ul>

我在这里做了一个例子:https://plnkr.co/edit/4cf5BlVoqzZdUQASVQaC?p=preview

关于angular - 在 Angular 2 中使用 ngForTemplate 时绑定(bind)事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com