Javascript 事件上的Vue$不';t使用事件总线首次触发

Javascript 事件上的Vue$不';t使用事件总线首次触发,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我想知道组件何时以及为什么不能处理正在侦听的第一个$on事件。 我有一个函数,它在调用时触发2个事件: initModalTimer: function () { serverBus.$emit('initSettingsModal', { 'name': 'Timer', }); serverBus.$emit('initTimer', { 'timer_type': this.timer_type, }); } InitS

我想知道组件何时以及为什么不能处理正在侦听的第一个$on事件。 我有一个函数,它在调用时触发2个事件:

 initModalTimer: function () {
    serverBus.$emit('initSettingsModal', {
       'name': 'Timer',

    });

    serverBus.$emit('initTimer', {
       'timer_type': this.timer_type,
    });
 }
InitSettingsModal模式的传递信息:

//Modal Component

<template>
<div v-else-if="elementName === 'Timer'">
    <timer></timer>
</div>
<div v-else-if="elementName === 'Socials'">
    <socials></socials>
</div>
</template>

<script>
   //Other Vue stuff
   created() {
      serverBus.$on('initSettingsModal', (elem_identifier) => {
        this.elementName = elem_identifier["name"];
      });
    }
</script>
但“initTimer”的第一个命令永远不会被触发。当我再次执行第一个函数(initModalTimer)时,一切正常


我发现了一个类似的问题,有人建议“事件总线listen$on发生在$emit之后”。但是我不明白它是什么意思。

我认为发生的事情是,在通过
v-else-if
语句呈现
组件之前,您的
initTimer
侦听器没有注册


您需要找到一种方法,在触发事件之前注册该侦听器,方法是将其注册到组件树的更高位置,或者更早地包含计时器组件,但在需要之前将其隐藏在视图中。

可能是一种可行的解决方案,将$on事件放在函数created()上。这对我有用

谢谢。我通过使用CSS来显示组件而不是v-if/else来解决这个问题。
//Timer Component

created() {
     serverBus.$on('initTimer', (response) => {
         //Execute code
     });
}