2016-09-19 118 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); 
     } 
    } 
相關問題