2016-07-31 10 views
1

申し訳ありませんが、ES6の初心者くさい:流星ES6脂肪矢印機能と `onCreatedでthis`が機能していない

Template.hello.onCreated(() => { 
    // counter starts at 0 
    this.counter = new ReactiveVar(0); 
}); 

Template.hello.helpers({ 
    counter() { 
    return Template.instance().counter.get(); 
    }, 
}); 

Template.hello.events({ 
    'click button'(event, instance) { 
    // increment the counter when button is clicked 
    instance.counter.set(instance.counter.get() + 1); 
    }, 
}); 

私はボタンをクリックすると、私はCannot read property 'get' of undefined

を取得しかし、私はやる

Template.hello.onCreated(function(){ 
    // counter starts at 0 
    this.counter = new ReactiveVar(0); 
}); 

正常に動作します。

私は得意でないthisキーワードのES6の太い矢印のバインディングで何かが起こっていますか?

答えて

2

メテオールがonCreatedハンドラーを呼び出すと、関数のthis値がテンプレートインスタンスにバインドされます。 Arrow functions字句的にバインドthisこれは、矢印関数内のthisが、関数が定義されている場所と同じであることを意味します。おそらくwindowです。その結果、テンプレートインスタンスに代入するのではなく、グローバル変数counterを作成しています。

onCreated,onRenderedなどについては、矢印機能を使用する意味がありません。

+0

興味深い。私は、矢印機能は、すべての機能を今後ES6で書く必要があると思ったのですか?これはES6では、実際にあなたが 'this'を使用している場合に使用する関数のタイプについて実際に考える必要があるのでしょうか? BTWの「カウンタ」は実際にはグローバル変数として作成されました。 – fuzzybabybunny

+0

正確には、両方のタイプの関数にはそれぞれ独自のユースケースがあります。場合によってはどちらを選択するかは関係ありませんが、 'this'コンテキストがフレームワークによって提供されるコールバック(' onCreated'など)は、「通常の」関数が必要な場合の1つの例です。ここにいくつかの他のケースをリストした素敵な記事があります:https://rainsoft.io/when-not-to-use-arrow-functions-in-javascript/。私のプロジェクトでは、矢印の機能によってコードを読みやすくしない限り、常に 'function'を使用します。 – chrisklaussner

+1

ああ、ありがとう。ここのスーパー貴重な情報。 – fuzzybabybunny

関連する問題