【发布时间】:2017-03-21 04:24:20
【问题描述】:
我有一个名为 ItemsComponent 的“智能”组件和两个嵌套的“哑”组件,ItemsListComponent 和 ItemComponent。
ItemsComponent 的 html 模板包含 ItemsListComponent。
// ItemsComponent
<div>
// ItemsListComponent
<app-items-list
[items]="items"
(doDelete)="deleteItem($event)"
>
</app-items-list>
<div>
它有一个名为deleteItem的函数:
deletItem(item) {
// code to handle item deletion...
}
ItemsListComponent 包含 ItemComponent:
// ItemsListComponent
<ul *ngFor="let item of items">
// ItemComponent
<app-item
[item]="item"
(doDelete)="deleteItem($event)"
>
</app-item>
</ul>
所以html结构是这样的:
ItemsComponent (app-items)
- ItemsListComponent (app-items-list)
- ItemComponent (app-item)
ItemComponent有一个按钮
<button (click)="deleteItem(item)">
以及deleteItem的事件发射器:
@Output() doDelete = new EventEmitter();
deleteItem(item) {
this.doDelete.emit(item);
}
当在 ItemComponent 中单击删除按钮时,事件只会冒泡到它的直接父级 ItemsListComponent,但不会到达 ItemsComponent 除非我将相同的事件发射器功能添加到 ItemsListComponent。
臭臭ItemsListComponent:
@Output() doDelete = new EventEmitter();
deleteItem(item) {
this.doDelete.emit(item);
}
它以这种方式工作,但是 ItemsListComponent 现在与 ItemsComponent 共享代码气味,因为它们都具有相同的事件发射器内容,并且必须将事件从一个组件传递到另一个正在上升。
有没有更好的方法来做到这一点?
【问题讨论】:
-
是的,@echonax 我认为你是对的。
-
我认为这是您随着时间的推移逐渐习惯的代码异味之一。
标签: angular