【问题标题】:Access the event object from global event bus in VueJS从 VueJS 中的全局事件总线访问事件对象
【发布时间】:2019-08-19 13:25:05
【问题描述】:

我有一些页面(在 Laravel 中),每个页面都包含一个具有不同操作 URI 的表单:

<form method="post" action="/route1">
    ...
    <button @click="emitEvent('event1')">
</form>

在 Vuejs 根目录中,我只有一个全局调用事件的方法:

const app = new Vue({
    el: '#app',
    methods: {
        emitEvent(event, payload) {
            EventBus.$emit(event, payload);
        }
    }
});

在我的组件中,我有一个全局事件的监听器:

data() {
    return {
        someKey: false //this value is dynamic
    }
}
mounted() {
    EventBus.$on('event1', (event) => {
        console.log(event); //returns undefined
        if(this.someKey) {
             window.location = "/another-url"; 
             //Go to this url ONLY if the is true, else go to the url from the action attibute of the form
        }
    });
}

所以基本上,如果在vue中满足某个条件,我想加载那个页面。

现在,无论vuejs中的条件是否满足,页面都会从html表单中加载url。

我尝试了@click.prevent="emitEvent('event1')" 而不是@click,但是这样,如果条件为假并且window.location 没有运行,它就会卡住。

我正在考虑访问事件对象,然后手动 preventDefault() 但仅在必要时,所以如果不是这种情况,页面将从表单的操作中加载 url,但我找不到获取的方法Vue 中的那个事件对象。

我发现事件名称在 EventBus._events.event1 中,但我无法继续前进,因为只有空属性,我不确定如何访问默认事件以便阻止它。

我确信它必须是一种更简单/更短和更好的方法,然后为每个表单提供一个 id/class,然后访问它,然后获取它的 action 属性,这是我需要的 url,最后如果访问该 url,如果条件不满足。这样它可能会起作用,但它可能是一种旧风格?

无论如何,我在这里是堆栈,我很感激任何帮助。

【问题讨论】:

  • 如何将点击事件移动到表单提交事件,然后返回false?

标签: javascript vue.js vuejs2 vue-component


【解决方案1】:

我会走这条路(像往常一样):

<form method="post" action="/route1" @submit="emitEvent('event1')">
    ...
    <button type="submit">
</form>

这样,提交事件将遵守预防措施。然后:

var that = this; // added a buffer to use in the event (hackish)
EventBus.$on('event1', (event) => {
    if(that.someKey) {
         window.location = "/another-url";     
         return false; // will prevent submission and change the url
    }
    return true; // will proceed submission
});

【讨论】:

  • 我刚试过,但它从表单中加载了相同的 url。
  • 那么您可能无法访问someKey。我现在会更新我的答案。
  • 仍然没有成功。无论如何,正如我所说,我有很多这样的页面(包括表单),我想避免在每个页面上编辑 html 的解决方案,而是如果可能的话,我想在 js 方面工作。
  • 好的,那么通过点击事件阻止表单提交似乎非常困难,也许是不可能的。
  • 是的,我同意,但我认为必须有一种方法可以访问该事件。我在 EventBus._events.event1 .. 和其他一些以 [[Scopes]] 结尾的嵌套数组中看到它,但我无法使用 .(dot) 表示法访问它……不知道为什么。无论如何,谢谢你的建议。
【解决方案2】:

你的错误在于@click-listener,你的电话:

emitEvent('event1')

使用 ONE 参数调用函数,因此函数中的 event-param 将始终是“字符串”类型的“event1”。

要回答您的问题,您必须将@click-listener 更改为:

@click="(e) => { emitEvent(e, 'event1') }"

解释:

当@click-listener 获得function 作为值时,它将以event 作为第一个(也是唯一一个)参数调用该函数。在您的情况下,您给@click-listener 一个undefined,因为您没有返回值。

这里仔细看看this doc.

【讨论】:

  • 是的,你是对的。那是缺失的部分。首先,我在使用您的代码时出错,然后我发现参数必须颠倒,因为第一个作为事件名称发送,而第二个(事件)实际上是有效负载。但无论如何,是的,你是对的,现在 event.preventDefault() 工作,如果条件满足,页面将重定向。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多