首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventEmitter与递归

EventEmitter与递归
EN

Stack Overflow用户
提问于 2016-07-20 17:21:02
回答 1查看 2.6K关注 0票数 2

当我有一个带有选择器'recursive-element'的模板时,它的模板如下所示

代码语言:javascript
复制
<li *ngFor="let x of y" (click)="greet($event)">
   <div *ngIf="x.children">
      <recursive-element [y]="x.children"></recursive-element>
    </div>
</li>

在课堂上我已经定义了

代码语言:javascript
复制
greetEvent = new EventEmitter();
greet(e){
  greetEvent.emit("hello world!");
  e.stopPropagation();
}

在另一个组件中,我将它添加到tempalte中,例如

代码语言:javascript
复制
hi(x){
  alert(x)
}

当我单击嵌套的recurive-element时,事件不会触发,但当我单击第一个li元素时,事件就会触发。

是因为递归,所以甚至只绑定到第一个递归元素,而不是嵌套的元素,还是有什么我想知道的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-20 19:11:43

angular2中的自定义事件不是冒泡,因此您可以:

  1. 当其中一个子事件发出一个事件时,在<recursive-element>上发出父事件--这将为每个子事件创建一个新的EventEmitter

在这种情况下,子组件应该如下所示:

代码语言:javascript
复制
@Component({
    selector: 'recursive-comp',
    template: `
        <div>
        <div *ngFor="let item; of tree;">
        <a href="#" (click)="onClick(item)">{{item.name}}</a>
        <recursive-comp *ngIf="item.children" [tree]="item.children" (clickEvent)="onClickChild($event)"></recursive-comp>
        </div>
        </div>
    `
})
export class RecursiveCmp {
    @Input() tree = null;
    @Output() clickEvent = new EventEmitter();

    constructor() {

    }

    onClick(item) {
        console.log("clicked", item);
        this.clickEvent.emit(item);
    }

    onClickChild(item) {
        this.clickEvent.emit(item);
    }
}

参见此每名儿童事件的柱塞

  1. 创建一个包含EventEmitter并将由父级和子级使用的服务。为此,服务应该是单例的,因此最好的选择是在bootstrap时注册提供者。

这是服务代码:

代码语言:javascript
复制
@Injectable()
export class ClickerService {
   clickEvent = new EventEmitter();

   clicked(item) {
     this.clickEvent.emit(item);
   }
}

儿童部分:

代码语言:javascript
复制
@Component({
  selector: 'recursive-comp',
  template: `
    <div>
      <div *ngFor="let item; of tree;">
        <a href="#" (click)="onClick(item)">{{item.name}}</a>
        <recursive-comp *ngIf="item.children" [tree]="item.children"></recursive-comp>
      </div>
    </div>
  `
})
export class RecursiveCmp {
  @Input() tree = null;
  constructor(private clickerService: ClickerService) {}

  onClick(item) {
    this.clickerService.clicked(item);
  }
}

参见此服务事件柱塞

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

https://stackoverflow.com/questions/38486941

复制
相关文章

相似问题

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