首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 2将事件从父对象发送到所有子对象

Angular 2将事件从父对象发送到所有子对象
EN

Stack Overflow用户
提问于 2017-02-03 17:50:27
回答 2查看 1.3K关注 0票数 1

我正在尝试实现一个简单的菜单栏。我有一个主菜单栏组件和许多子菜单,可以是不同的深度。我想在关闭主菜单栏时关闭每个子菜单。因此,我希望父组件向每个子组件发送一个没有任何数据的简单事件。

我希望在使用子菜单组件时不必声明任何输入,因为此事件订阅是强制的,并且对于每个子菜单都是相同的。因此,声明将更加简单,并将避免进一步的错误。

换句话说,我在菜单栏组件中有这个:

代码语言:javascript
复制
<sub-menu [title]="File">
    <sub-menu [title]="New" (onclick)="newFile()"></sub-menu>
    <sub-menu [title]="Open" (onclick)="openFile()"></sub-menu>
    <sub-menu [title]="Save" (onclick)="saveFile()"></sub-menu>
</sub-menu>
<sub-menu [title]="Edit">
    <sub-menu [title]="Copy" (onclick)="copy()"></sub-menu>
    <sub-menu [title]="Paste" (onclick)="paste()"></sub-menu>
</sub-menu>

并希望这个父组件向每个子菜单发送一个事件,而不必声明任何如下内容:

代码语言:javascript
复制
<sub-menu [title]="File" [mainClosed]="closed">
    <sub-menu [title]="New" (onclick)="newFile()" [mainClosed]="closed"></sub-menu>
    <sub-menu [title]="Open" (onclick)="openFile()" [mainClosed]="closed"></sub-menu>
    <sub-menu [title]="Save" (onclick)="saveFile()" [mainClosed]="closed"></sub-menu>
</sub-menu>
<sub-menu [title]="Edit" [mainClosed]="closed">
    <sub-menu [title]="Copy" (onclick)="copy()" [mainClosed]="closed"></sub-menu>
    <sub-menu [title]="Paste" (onclick)="paste()" [mainClosed]="closed"></sub-menu>
</sub-menu>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 17:56:45

您可以使用@ViewChildren将子组件作为ViewChildren注入父组件

在您的父组件中,您需要定义类似以下内容的内容

代码语言:javascript
复制
import { ViewChildren, QueryList } from '@angular/core';

export class parentMenuComponent {

    @ViewChildren(SubMenu) allSubMenus: QueryList<SubMenu>;
    ...

    constructor() { }

    closeAll(){
        this.allSubMenus.forEach((subMenu) => subMenu.close());
    }
}

其中SubMenu是子组件的名称

有关@ViewChild@ViewChildren如何工作的更多信息,请访问here

票数 3
EN

Stack Overflow用户

发布于 2017-02-03 18:00:16

代码语言:javascript
复制
@Injectable() 
class MenuShared {
  private subject = new BehaviorSubject(null);
  readonly close:Observable = this.subject.asObservable();

  notifyClose() {
    this.subject.next(true);
  }
}
代码语言:javascript
复制
@Component({
  selector: 'sub-menu',
  providers: [MenuShared]
})
export class SubMenuComponent {
  constructor(
      private menuShared:MenuShared, 
      @SkipSelf() @Optional() private parentMenuShared:MenuShared) {
    parentMenuShared.close.subscribe((_) => {
      this.closed = true;
      this.onClose();
  }
  onClose() {
    this.menuShared.notifyClose();
  }
}

这样,每个菜单都可以与其自身及其子菜单共享一个服务实例。它可以订阅父通知来关闭自己,并通知childs自己正在关闭。

@SkipSelf()不会从自身获取实例。@Optional()不会在根菜单上出现错误,因为它不能从父级注入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42021355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档