2017-07-30 48 views
2

我有一個父級,可以在其中動態添加子組件。停止接收來自已銷燬的子組件的事件

當子組件在安裝件被加入予註冊偵聽的事件

EventBus.$on('content-type-saving', function() { 
    logic here... 
} 

問題是,當該組件在父通過從子組件的陣列除去它刪除,即使仍然火災和代碼在裏面運行。

我怎樣才能防止這種情況發生?我想這

beforeDestroy() { 
     //do something before destroying vue instance 
     EventBus.$off('content-type-saving') 
    } 

但關閉該事件對所有其他的子組件,以及使那些仍然生活不會做邏輯的東西了,因爲我在銷燬子組件關閉事件。

我想如果我關閉了一個事件,它只會影響監聽該子組件的事件,而不是爲所有子組件打開事件。

如何阻止銷燬組件對事件做出反應?

回答

4

當您撥打$off時,只需指定事件的名稱all listeners are removed即可。

相反,您只想爲正在監聽的組件移除事件。你的組件應該看起來像這樣:

const component = { 
    methods:{ 
    listener(){ 
     //do something on event 
    } 
    }, 
    created(){ 
    EventBus.$on('content-type-saving', this.listener) 
    }, 
    beforeDestroy(){ 
    EventBus.$off('content-type-saving', this.listener) 
    } 
} 

這將只刪除當前組件的特定偵聽器。

1

我會想象你正在渲染組件的某種循環,給他們某種索引。就在我頭頂之後,你可以做的就是將索引推送到一個數組,然後在你的eventBus。$ on函數中進行測試,看看該組件的索引是否存在於數組中(在父組件上)和如果不符合邏輯的話,就會觸發它。

EventBus.$emit('content-type-saving', index); 

EventBus.$on('content-type-saving', function(index) { 
    if(this.deletedComponentArray.indexOf(index) == -1){ 
     //execute logic 
    } 
} 

這只是皮膚貓的一種方法。我相信還有其他的方式來做這件事。