2016-09-19 113 views
0

为了接收来自多个子组件的事件在一个父组件 我从父(ProjectsComponent)通过事件信道到每个子组件(ProjectHeaderComponent)EventEmitter:同时发生的事件混合,如何防止这种情况发生?

projects.component.ts

projects: Project[]; 
    editing = false; 
    channel: EventEmitter<boolean>; 

    constructor(private projectService: ProjectService) { 
    this.channel = new EventEmitter<boolean>(false); 
    this.channel.subscribe(isEditing => { 
     this.editing = isEditing; 
     console.log(this.editing); 
    }); 
    } 

projects.component。 HTML

<div *ngFor="let project of projects"> 
    <project-header [project]="project" [isEditing]="channel"></project-header> 
</div> 

项目header.component.ts

@Input() project: Project; 
    @Input() isEditing: EventEmitter<boolean>; 

    set editing(data: boolean) { 
    //.... 
    this.isEditing.emit(this._editing); 
    } 

项目header.component.html

<input type="text" (click)="toggleEditing()"> 

但是,如果我已经在一个输入和点击另一个,事件融入我收到true, false,而不是false, true

我试着换this.editing = isEditing;setTimeout(() => this.editing = isEditing, 0);但那不行。

+0

很难给予当我们不知道哪来的财产的任何建议'editing'使用的事件。否则,这段代码对我来说看起来很好,应该按照你的要求工作(如果我正确理解你需要的)。 – martin

+0

谢谢@Martin,在setTimeout的底部添加开放事件到底部的调用堆栈,因为在答案看起来很好,我停下来,谢谢) – bjornmelgaard

回答

0

黑客之一 - 关于开放必须到达后关闭

set editing(data: boolean) { 
     /*on close*/ 
     if (!this._editing) { 
     this._editedService.changeEdited(this._editing); 
     } else /*on open*/ { 
     setTimeout(() => this._editedService.changeEdited(this._editing), 0); 
     } 
    } 
相关问题