2016-03-22 9 views
5

Vue.jsはclickmousedownのようなブラウザイベントでうまくいきます。しかし、カスタムイベントではまったく動作しません。ここでは、コードは次のようになります。Vue.jsのカスタムイベントを聞く

HTML:

<div id="app" style="display: none" v-show="true"> 
    <div v-el:ping v-on:ping="ping"> 
     <div> 
      <button v-on:click="click">Click</button> 
     </div> 
    </div> 
</div> 

はJavaScript:

new Vue({ 
    el: '#app', 
    data: { 
    }, 
    methods: { 
     ping: function (event) { 
      console.log('Vue ping', event); 
      alert('Vue ping'); 
     }, 
     click: function (event) { 
      jQuery(event.target).trigger('ping'); 
     } 
    }, 
    ready: function() { 
     console.log(this.$els); 
     jQuery(this.$els.ping).on('ping', function (event) { 
      console.log('jQuery ping', event); 
      alert('jQuery ping'); 
     }); 
    } 
}); 

私はVue pingjQuery pingと警告し期待しています。しかし、後の方だけがポップアップします。

CodePen

+0

コードの問題はどこですか? – Gintoki

+0

@John '' ping''メソッド( '' alert( 'Vue ping') '')は呼び出されません – vbarbarosh

答えて

1

ここでは、バニラJSである:

HTML:

<div id="app"> 
    <div v-el:ping> 
    <div> 
     <button v-on:click="click">Click</button> 
    </div> 
    </div> 
</div> 

JS:

(function() { 

    new Vue({ 
    el: '#app', 
    data: { 
     event: null 
    }, 
    methods: { 
     ping: function(event) { 
     alert('Vue ping'); 
     }, 
     click: function(event) { 
     this.$els.ping.dispatchEvent(this.event); 
     } 
    }, 
    ready: function() { 
     this.event = document.createEvent("HTMLEvents"); 
     this.event.initEvent("ping", true, true); 
     this.$els.ping.addEventListener('ping', this.ping); 
    } 
    }); 

})(); 

ペン:http://codepen.io/anon/pen/wGdvaV?editors=1010#0

+0

これは意味がありません。私は '' jQuery(event.target).trigger( 'ping') ''を使用します。なぜなら、誰がこのイベントを処理するかわからないからです。私はその子孫に何かが起こったことを親に知らせる必要があります。 – vbarbarosh

+0

'$ dispatch'を見たことがありますか? http://vuejs.org/api/#vm-dispatch – Jeff

+0

http://stackoverflow.com/questions/36156465/listen-to-custom-event-in-vue-js/36159698#comment59980051_36159698 – vbarbarosh

6

ヴューました

click: function (event) { 
    // jQuery(event.target).trigger('ping'); 

    this.$dispatch('ping', event.target) // send event up the parent chain, optionally send along a reference to the element. 

    // or: 
    this.$emit('ping') // trigger event on the current instance 
} 

編集:$派遣は親子コミュニケーションのために、あなたが同じcomonent内からカスタムイベントをトリガするように見えるされ、それはあなたがjQueryの/ネイティブDOMイベントの代わりに使用すべき、独自の内部system for custom eventsです。その場合、代わりに単にメソッドを呼び出すことができます。

それでも同じコンポーネント内のカスタムイベントを聞きたい場合は、あなた:

  1. は$使いたいが発する
  2. (つまり、コンポーネント上で使用するだけです)テンプレートでv-on:custom-event-nameを使用cannnot 。

    イベント:{ ピング:関数(){...}} あなたはDOMイベントとVUE-成分を混合するために避けるべき

+0

動作しません。 "このイベントシステムは、ネイティブのDOMイベントとは独立しており、動作が異なります。"私はDOMノード間ではなく、Vueコンポーネント間の通信のためにそれを考えています。 – vbarbarosh

+0

どのように動作しないのですか? Vue.jsを使用しているため、私はあなたが意識しているコンポーネントを通信したいという印象を受けていましたか? DOM? 追加情報を提供する場合は、ユースケースを「Vue方法」に翻訳する手助けをすることもできます。 –

+0

私が提供したソースコードを修正すれば、とても感謝しています。問題は、カスタムイベントハンドラをVueに接続して、jQuery.triggerによって生成されるイベントをインターセプトする方法でした。 – vbarbarosh

1

むしろ、events:にイベントメソッドを追加それは抽象化の異なるレイヤーなので、関連するものです。あなたがまだあることをしたいならば、私はあなたがVUE-コンポーネントインスタンス内this.elキャッシュまたはこの

{ 
    computed : { 
     jqueryEl(){ return $(this.el) } 
    } 
} 

のように計算され、プロパティを経由してそれを取ると、カスタムをトリガーする必要があると思うとにかく

、 jQueryイベントby this.jqueryEl.trigger('ping')

要素のバインディングを最新の状態に保つのが適切であることを確かめてください! たとえば、あなたは、動的にjQueryのイベントをバインドすることができ、このような(とも破壊するコンポーネントにバインド解除!):

ready : function(){ 
    jQuery('body').on('ping.namespace', '[data-jquery="ping"]', function(){ ... }) 
}, 
destroy : function(){ 
     jQuery('body').off('ping.namespace') 
} 

そして、あなたは、応答のpingイベントをしたい要素に属性[data-jquery="ping"]を追加することを忘れないでください。

この情報は、期待した結果を得るのに役立ちます。

関連する問題