Javascript 为什么不能';是否在vue.js中触发自定义事件?

Javascript 为什么不能';是否在vue.js中触发自定义事件?,javascript,jquery,laravel-5,vuejs2,Javascript,Jquery,Laravel 5,Vuejs2,我有一个本地数据库,将用pusher更新。该数据库存储在JSON中,组件将加载并过滤掉不需要的内容,从而无法向原始数据添加观察者 我的想法(如果有更好的解决方案,请告诉我)是为自定义事件添加一个侦听器,然后在数据库更新时触发此事件。我能触发的唯一事件是“单击”,它带有一个简单的$('.vue template')。trigger('CLICK') 这与我选择作为目标的元素上的一个简单的@click=“doSomething”相匹配 这并不理想,因为我不想在任何单击时获取数据,而只想在数据库更新时

我有一个本地数据库,将用pusher更新。该数据库存储在JSON中,组件将加载并过滤掉不需要的内容,从而无法向原始数据添加观察者

我的想法(如果有更好的解决方案,请告诉我)是为自定义事件添加一个侦听器,然后在数据库更新时触发此事件。我能触发的唯一事件是“单击”,它带有一个简单的
$('.vue template')。trigger('CLICK')

这与我选择作为目标的元素上的一个简单的
@click=“doSomething”
相匹配

这并不理想,因为我不想在任何单击时获取数据,而只想在数据库更新时获取数据,所以我尝试了
@customevent=“doSomething”
,但它不起作用

有什么帮助吗

编辑:更多代码

<template>
    <div class="listen listen-database-teachers"
         @dbupdate="testAlert">
        <span v-for="teacher in teachers"
              class="pointer btn btn-sm btn-default destroy-link"
              :data-href="computedHref(teacher)"
              :data-person="personIdentifier(teacher.person)"
              :data-personid="teacher.person_id">
        {{ personIdentifier(teacher.person) }} <span class="glyphicon glyphicon-remove"></span>
        </span>
    </div>
</template>

<script>
    export default {
        props: ['circleId'],
        data () {
            return {
                loading: false,
                teachers: null,
                error: null
            }
        },
        created () {
            // fetch the data when the view is created and the data is
            // already being observed
            this.fetchData();
        },
        methods: {
            fetchData() {
                this.error = this.teachers = this.categories = null;
                this.loading = true;

                var teachers = $(window).localDatabase('teachers', $(window).planner('currentSchoolId'));

                var searchCircle = this.circleId,
                    filtered_teachers = [];
                $.each(teachers, function(index, teacher){
                    if(teacher.membership_id == searchCircle)
                        filtered_teachers.push(teacher);
                });
                this.teachers = filtered_teachers.sort(function(a, b) {
                    return personIdentifier(a.person) > personIdentifier(b.person);
                });

                this.loading = false;
            },
            computedClass(teacher){
                return 'pointer btn btn-sm btn-default draggable membership-draggable-'+teacher.membership_id+' destroy-link'
            },
            computedHref(teacher){
                return window.links.destroy_membership
                        + '?association-id='+teacher.id
                        + '&circle-id='+teacher.circle_id;
            },
            testAlert: function(){
                return alert('success');
            }
        }
    }
</script>
master.js

window.vue_bus = new Vue();
function handleDatabaseUpdate(){
    window.vue_bus.$emit('refresh-data');
}
import Vue from "vue"

const bus = new Vue()
export default bus;
组件

created () {
        // fetch the data when the view is created and the data is
        // already being observed
        this.fetchData();
        window.vue_bus.$on('refresh-data', this.testAlert());
    },

我已经分离出了代码的相关部分。安装组件时执行
testAlert()
,但当我从浏览器控制台(在Firefox上)调用
handleDatabaseUpdate()
时返回一个错误
cbs[i]undefined

在这种情况下,我可能会使用

只需创建一个空的Vue即可创建总线

const bus = new Vue()
在外部处理数据库的任何函数中,都可以使用总线发出事件

function handleDatabaseUpdate(){
   //do database things
   bus.$emit("refresh-data")
}
然后在组件中添加一个处理程序

created(){
    bus.$on("refresh-data", this.fetchData)
}
因为看起来您使用的是单文件组件,所以您必须使该总线对组件和数据库管理器都可用。你可以用两种方法。又快又脏,把公共汽车暴露在窗户上

window.bus = new Vue()
其次,您可以在自己的模块中创建总线,并将模块导入到需要使用它的所有位置

bus.js

window.vue_bus = new Vue();
function handleDatabaseUpdate(){
    window.vue_bus.$emit('refresh-data');
}
import Vue from "vue"

const bus = new Vue()
export default bus;
在处理数据库和组件的代码中,导入总线

import bus from "/path/to/bus.js
也就是说,您无法在Vue中侦听jQuery事件的原因是jQuery使用自己的事件系统,Vue的侦听器永远不会捕获jQuery事件。如果仍然希望使用jQuery,可以在jQuery中发出一个自定义事件,并使用jQuery侦听该自定义事件。您只需将事件分派到fetchData即可

created(){
    $("thing you sent the event from").on("refresh-data", this.fetchData)
}

最后,这也是一个状态管理系统(如Veux)将大放异彩的例子。状态管理系统适用于这样的情况,即状态可能在许多地方发生变化,并在视图中自动反映这些变化。当然,要实现它们还有更多的工作。

在Vue上,你可以提高你的效率,也可以编写你的@Max,这也是我的想法,但它们是如何触发的?我的理解是,唯一的方法是点击项目<代码>方法:{raiseMyEvent(){this.$event(“myEvent”,myData);}}
replace
$('.vue template')。触发器('click')raiseMyEvent()
user对当前事件进行编码>以触发事件instance@Max这可以从组件外部工作吗?当数据库在vue appI外部更新时,我需要调用此函数。keep Get TypeError:从控制台调用handleDatabaseUpdate()时,cbs[I]未定义。我使用window.bus方法,因为另一种方法是说总线未定义。。。我做错了什么?@clod986 handleDatabaseUpdate的代码是什么?我假设您有一个名为
cbs
的变量,可能是一个数组,但它没有值。我不知道这是从哪里来的,我粘贴了您的代码以便在更改它之前使其工作。。。但这没什么用。我意识到每次创建组件时都会调用该函数(我仍在使用警报以加快调试),但它不应该被调用t@clod986我需要查看代码以便提供帮助。我编写的handleDatabaseUpdate函数只是获取数据库数据的任何内容的占位符。我用另一个编辑更新了我的问题,以向您显示代码的相关部分。谢谢你的时间