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