Mod*_*esq 5 javascript jquery vue.js vuejs2
我正在尝试将click事件附加到已经存在的dom元素中。
<div class="logMe" data-log-id="{{ data.log }}"></div>
...
<div id="events"></div>
Run Code Online (Sandbox Code Playgroud)
我似乎无法在我的jquery click处理程序内访问vue方法。它会抛出logData is not defined。
new Vue({
el: '#events',
mounted() {
$('.logMe').on('click', function() {
const data = $(this).data('log-id');
this.logData(data); // throws logData is not defined
});
},
methods: {
logData(id) {
console.log(id); // never fires
... hit server
},
},
});
Run Code Online (Sandbox Code Playgroud)
如果有人知道将单击事件附加到.html元素的更好方法,那就太好了!但是,如何冒泡并找到我的vue方法?这是一个小提琴来说明
Ber*_*ert 10
为了使代码正常工作,您可以这样编写:
console.clear()
new Vue({
el: '#events',
mounted() {
$('.logMe').on('click', (evt) => {
console.log("called")
const data = $(evt.target).data('logId');
this.logData(data);
});
},
methods: {
logData(id) {
console.log(id);
},
},
});Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://unpkg.com/vue@2.4.2"></script>
<div class="logMe" data-log-id="10">Something</div>
<div id="events"></div>Run Code Online (Sandbox Code Playgroud)
请注意,该代码使用箭头函数定义点击处理程序,以便this捕获适当的内容以logData在Vue上调用该方法。但是,这样做意味着您失去了this想要从data属性获取数据的能力,因此该示例使用evt.target。
还有一种替代方法,您可以将Vue捕获到变量中,然后直接从jQuery事件中调用该方法。
console.clear()
const app = new Vue({
el: '#events',
methods: {
logData(id) {
console.log(id); // never fires
},
},
});
$('.logMe').on('click', function(){
app.logData($(this).data("logId"))
});Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@2.4.2"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div class="logMe" data-log-id="10">Something</div>
<div id="events"></div>Run Code Online (Sandbox Code Playgroud)