单击事件从jQuery的火vue方法

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)