【问题标题】:Angular2 emit event up to the DOM treeAngular2 将事件发送到 DOM 树
【发布时间】:2016-01-18 16:15:56
【问题描述】:

我有 3 个组件来管理树:面板、树和节点。

面板包含一棵树

@Component({
  selector: 'panel',
  template: `
    <input type="button" (click)="createNode()" value="new node">
    <input type="button" (click)="createChild()" value="new child">
    <input type="button" (click)="deleteNode()" value="delete node">
    <tree [tree]="myTree"></tree>
    Selected node: {{selectedNode | json}}
  `,
  directives: [Tree]
})
export class Panel {
  public selectedNode;
  constructor() {}
}

树包含一个或多个节点(根节点)

@Component({
  selector: 'tree',
  template: `<node *ngFor="#n of tree" [node]="n"></node>`,
  directives: [Node]
})
export class Tree {
  @Input() tree;
  constructor() {}
}

一个节点又可以包含一个或多个节点(子节点)

@Component({
  selector: 'node',
  providers: [],
  template: `
    <p (click)="onSelect(node)">{{node.name}}</p>
    <div class="subTree">
      <node *ngFor="#n of node.children" [node]="n"></node>
    </div>
  `,
  directives: [Node]
})
export class Node {
  @Input() node;
  constructor() {}

  onSelect(node) {
    console.log("Selected node: " + node.name);
  }
}

Panel 是一个组件,它允许通过向树中添加和删除节点来编辑树。 我要做的是每次单击树中的节点时更新面板中的变量“selectedNode”。

click事件的handler在Node组件里面,这里我想通知Panel一个Node被点击了,然后更新上面的变量。

这是我迄今为止所做的简化Plunkr

我研究了几种可能的解决方案,但没有找到任何适合我需要的解决方案。我知道@Output-EventEmitter 机制允许向父组件发送事件,但在我的情况下,节点的父节点是树(在根节点的情况下)或另一个节点(子节点)。

在 AngularJS 中,我使用 $emit 在单击节点时发送事件,并使用 $on 在 Panel 中捕获它并更新 selectedNode 变量。 在 Angular2 中,$emit$broadcast$on 事件机制不再可用。 我怎样才能达到我的目标?任何建议,即使不是基于事件的,都值得赞赏。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    EventEmitter 触发的事件根本不会冒泡。一种解决方法是改用EventBus 服务。

    另请参阅Global Events in Angular 2Delegation: EventEmitter or Observable in Angular2

    【讨论】:

      【解决方案2】:

      我在这里创建了一个通用的 pub-sub 示例,您也可以查看它。

      这个想法是使用来自 RxJs 的主题。主题既可以用作观察者,也可以用作可观察者。这允许我通过同一个服务发出和订阅值。

      import {Subject } from 'rxjs/Subject';
      import {Customer} from './customer';
      export class CustomerEventEmitter extends Subject<Customer>{
          constructor() {
              super();
          }
          emit(value) { super.next(value); }
      }
      
      //Consume
      this.service.Stream.subscribe(...);
      
      //Produce
      this.service.Stream.emit(customer);
      

      这里是它的演示:http://www.syntaxsuccess.com/angular-2-samples/#/demo/pub-sub

      全文:

      http://www.syntaxsuccess.com/viewarticle/pub-sub-in-angular-2.0

      【讨论】:

        猜你喜欢
        • 2018-02-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多