2017-07-30 64 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 
    } 
} 

这只是皮肤猫的一种方法。我相信还有其他的方式来做这件事。