2017-04-02 8 views
1

私はVue 2.0のチュートリアルを勉強していますが、イベントバスを使用したコミュニケーションのレッスンを終えてすぐ親以外のコンポーネントとの通信が可能になりました。2番目のVueインスタンスを非親子通信用にインスタンス化するには

チュートリアルで提示されたコードは私にエラーを与えましたが、私は以下で説明するようにそれを私自身で解決することができました。私はなぜ自分の学習と理解のために元のコードがうまくいかなかったのか理解したいと思います。次のように

チュートリアルで与えられたコードは次のとおりです。

Window.Event = new Vue(); 

Vue.component('coupon', { 

    template: '<input placeholder="Coupon Code" @blur="onCouponApplied">', 

    methods: { 
     onCouponApplied() { 
      Event.$emit('applied'); 
     } 
    } 
}); 

var app = new Vue({ 
    el: '#root', 

    created() { 
     Event.$on('applied',() => alert('Handling it!')); 
    } 
}); 

私が実行しようとしたとき、私はエラーを受け取りました:「例外TypeError:イベント$には関数ではありません」。オンライン調査した結果、私は単純に最初のVueインスタンスのインスタンス化を変更:

var bus = new Vue(); 

と、次のように続い/発するように呼ば:

bus.$emit('applied'); 

bus.$on('applied',() => alert('Handling it!')); 

の場合を私自身の理解、私は以下のいくつかの助けに感謝します:

  1. 元のWindow.Event形式が私のために働いていないのはなぜですか? 他の人のために働いていたのはなぜですか?
  2. このチュートリアル のコメントセクションには、Window.Eventをベストプラクティスとして使用している行に沿って、 のコメントがありましたが、その理由を説明していませんでした。
  3. 私がやったやり方に間違いがありますか? 元の機能を使用しないと失うことになります。 Window.Event?

ありがとう!

答えて

4

チュートリアルでは、文字通り、彼らが悪い考えを推奨している、

window.Event = new Vue() 

をこの正確なラインを推奨している場合。 Eventnative browser objectです。たとえそれを上書きできる場合でも、間違いないはずです。 Vue自体を含む多くの他のライブラリが依存するオブジェクトを置き換えることになります。

、他の一方で、あなたが実際にこのコード

Window.Event = new Vue() 

を書いたなら、あなたがお使いのブラウザでは何でもWindowにごVueのオブジェクトを追加しました。大文字のWに注意してください。 Windowwindowと同じではありません。小文字のwindowは、すべてのブラウザのグローバルオブジェクトを参照します。クロムでは、Windowは何か他のものを指しています(正確にはどういうものかはわかりません)。

したがって、​​を呼び出そうとすると、上にリンクしたネイティブのイベントオブジェクトを参照していますが、作成しようとしたバスではなくエラーが発生します。

+0

うわー、大文字の「W」が私の問題でした!恥ずかしいが、本当にありがとう。だから私が正しく読んだら、私がvarバスを使って行ったやり方は、どんな場合でも良いアプローチですか? –

+0

@DustinS 'var bus'は完璧です! – Bert

+0

@DustinS私は 'window.bus'を書くことがあるかもしれないことに注意してください。たとえば、複数の別々のファイルをコンパイルするためにwebpackを使用していた場合は、それを行う必要があります。 – Bert

関連する問題