我正在编写一个组件,我们称其为组件DropDownComponent,它将在我的应用程序中重用,并且将有 7 个以上可能的条目,每个条目都将在父组件中运行不同的操作。有些选项并非在它们运行的每个地方都可用。我想做的是在实例化中仅指定组件的 @Output 处理程序,如下所示:
<drop-down-component
(addHandler)="add($event)"
(removeHandler)="remove($event)"></drop-down-component>
Run Code Online (Sandbox Code Playgroud)
然后在我的组件中:
export class DropDownComponent {
@Output() addHandler: EventEmitter<string> = new EventEmitter();
@Output() removeHandler: EventEmitter<string> = new EventEmitter();
@Output() editHandler: EventEmitter<string> = new EventEmitter();
@Output() renameHandler: EventEmitter<string> = new EventEmitter();
...
Run Code Online (Sandbox Code Playgroud)
在子组件中,我希望能够查看editHandler和renameHandler是否绑定到任何东西,如果没有,只需使用 将它们从模板代码中删除*ngIf,所以我只看到:
<drop-down>
<div (click)="...">Add</div>
<div (click)="...">Remove</div>
<!-- ngIf'd by component <div (click)="...">Edit</div> -->
<!-- ngIf'd by component <div (click)="...">Rename</div> -->
</drop-down>
Run Code Online (Sandbox Code Playgroud)
这似乎应该是可能的,但我还没有找到任何方法来做到这一点。[showAddOption]="true"显然,只需向父级模板添加一个参数就足够简单了,但如果我可以在子组件中进行说明,并且可以将参数数量减少一半,那么事情就会变得简单。
observers现已内部转移至Subject. 感谢@Tonio 指出这一点。
新的Subject实现使此检查更容易,如此处observed所示的函数
<div *ngIf="editHandler.observed" (click)="...">Edit</div>
<div *ngIf="renameHandler.observed" (click)="...">Rename</div>
Run Code Online (Sandbox Code Playgroud)
EventEmitter延伸Subject。这意味着您可以检查observers您的Subject.
在您的 HTML 中尝试此操作
<div *ngIf="editHandler.observers.length > 0" (click)="...">Edit</div>
<div *ngIf="renameHandler.observers.length > 0" (click)="...">Rename</div>
Run Code Online (Sandbox Code Playgroud)
这也可以重写为
<div *ngIf="editHandler.observers.length" (click)="...">Edit</div>
<div *ngIf="renameHandler.observers.length" (click)="...">Rename</div>
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,这里是如何使用hasObservers()方法来做到这一点
超文本标记语言
<div *ngIf="hasObservers(editHandler)" (click)="...">Edit</div>
<div *ngIf="hasObservers(renameHandler)" (click)="...">Rename</div>
Run Code Online (Sandbox Code Playgroud)
成分
hasObservers(eventEmitter: EventEmitter<any>): boolean {
return eventEmitter.observers.length > 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1709 次 |
| 最近记录: |