2017-02-12 82 views
3

使用Vue的2.1.10Vue.js绑定到DOM自定义事件与名点(如引导事件)

我可以绑定到DOM事件与v-on指令。例如:

v-on:click 

绑定到DOM单击。 但我不知道如何绑定到名称中有点的事件。如引导程序中的“show.bs.modal”。

目前,我用一种变通方法在created钩与常规的DOM方法结合,但我真的想用声明的语法为。这怎么能实现?感谢

编辑: 问题是关于可以使用的语法:我怎么可以这样做:

Vue.component('comp',{ 
    template:'<div v-on:show.bs.modal="sunrise"></div', 
    methods:{ 
    sunrise:function(e){ 

    } 

    } 
}) 
+0

用点你的意思是类的名字? '.class.name' –

+0

你可以在这个示范问题上抛出一个jsfiddle吗? – Austio

+0

@Austio不是“捣鼓”的问题,语法问题,请编辑 – alonisser

回答

1

我想点不是v-on支持,但你可以创建一个自定义指令创建活动聆听该事件。

不知道,如果有什么更容易,但像在下面的演示或本fiddle应该工作。

演示创建与名点的新的事件,但也应该有引导的事件工作(未测试)。请让我知道,如果它不适用于引导程序,我会看看。

解除绑定只有当你使用v-if工作。如果你直接用Javascript去除那个元素。该活动将仍然在那里。

var helloEvent = new Event('demo.event.hello'); 
 

 
document.addEventListener('demo.event.hello', function(e) { 
 
    // this is just for testing event dispatching! 
 
    console.log('main event listener'); 
 
}, false); 
 

 
const bindCustomEvent = { 
 
    getName: function(binding) { 
 
    return binding.arg + '.' + 
 
     Object.keys(binding.modifiers).map(key => key).join('.'); 
 
    }, 
 
    bind: function(el, binding, vnode) { 
 
    const eventName = bindCustomEvent.getName(binding); 
 

 
    console.log(el, eventName); 
 
    document.addEventListener(eventName, binding.value); 
 
    }, 
 
    unbind: function(el, binding) { 
 
    const eventName = bindCustomEvent.getName(binding); 
 
    console.log('unbinding', eventName); 
 
    document.removeEventListener(eventName, binding.value); 
 
    } 
 
}; 
 

 
Vue.directive('bindCustomEvent', bindCustomEvent); 
 

 
new Vue({ 
 
    el: '#app', 
 
    data() { 
 
    return { 
 
     enabled: true, 
 
     eventMsg: '' 
 
    }; 
 
    }, 
 
    methods: { 
 
    sunrise: function(e) { 
 
     console.log('received event'); 
 
     this.eventMsg = 'received event'; 
 
    }, 
 
    testEvent: function() { 
 
     document.dispatchEvent(helloEvent); 
 
    }, 
 
    toggle: function() { 
 
     console.log('toggle', this.enabled); 
 
     this.enabled = !this.enabled; 
 

 
     if (!this.enabled) { 
 
     this.eventMsg = ''; 
 
     } 
 
    } 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.js"></script> 
 
<div id="app"> 
 
    <div v-bind-custom-event:demo.event.hello="sunrise" v-if="enabled"> 
 
    Hello, {{eventMsg}} 
 
    </div> 
 

 
    <!-- 
 
    The following markup is not working 
 
    <div v-on="demo.event.hello:sunrise" v-if="enabled"> 
 
    Hello, {{eventMsg}} 
 
    </div>--> 
 
    <button @click="testEvent()"> 
 
    Change 
 
    </button> 
 
    <button @click="toggle"> 
 
    <span v-if="enabled">disable custom event</span> 
 
    <span v-else>enable custom event</span> 
 
    </button> 
 
</div>