2016-05-26 16 views
1

インスタンス変数として遅延オブジェクトを持つES6クラスがあります。私は、次のようなangularjs約束、内部のthisオブジェクトにアクセスしようとしているが、thisは未定義で、バベルによると:約束内のES6でこのオブジェクトにアクセス

class MyClass { 

    constructor($q) { 
    this.deferred_ = $q.defer(); 
    } 

    myMethod() { 
    this.deferred_.promise.then(data => { 
     console.log(this); 
    }); 
    } 
} 

どういうわけか、私はスコープにthisをバインドするために、2つの矢印の関数を使用すべきだと思います約束はしていますが、私はどのように考え出すことができません。どのようにそれを行うにはどのようなアイデア?

+1

このコードでは、「this」は確かに 'MyClass'のインスタンスを参照します。 – zerkms

+0

それはしません。私は.promise表記法がこれをクラススコープから盗むと思います。なぜそれがうまくいかないのか分からない。 – mohi666

+1

まあ** ** https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&experimental=true&loose=false&spec=true&playground=true&code=class%20MyClass%20%7B %0D%0A%0D%0A%20%20%%20%20%20%20%20%%20%%20%%20%20%%20% 20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7% %3B%0D%0A%20%20%20%20%7D)%3B%0D%0A%3E%20%7B%0D%0A%20%20%20%20%20%20console.log %20%20%7D%0D%0A%7Dあなたの問題を示す例を提供してください。投稿されたコードは問題ありません。 – zerkms

答えて

2

使用しているライブラリは問題ではありません。矢印機能のコンテキストを変更することはできません。

var x = 5; 
var f =()=> this.x; 

f();    //=> 5 
f.call({x:3}); //=> 5 
z.bind({x:3})(); //=> 5 

他の人はあなたが投稿したコードでは、コメントしているように、thisMyClassのインスタンスを参照します。それを変えることのできるものは何もありません。

+0

私はchrome dev consoleを使ってこの問題をデバッグしていました。私はそこの上で未定義になっていた。私はChromeのデベロッパーコンソールを見て、ES6はまったくサポートしていないと思います。だからこそ、それは未定義に戻っていた。 – mohi666

+0

@ mohi666まだ、ES6の完全な実装はまだありませんが、Chrome(およびそのデベロッパーコンソール)はいくつかのES6の特色をサポートしています。 – naomik

+0

*これはMyClassのインスタンスを参照します。そして、これを変えることのできるものは何もありません。この行は厳密には真実ではありません。 'var c = new MyClass; c.myMethod.call({}); 'は' myMethod'の 'this'参照をバインドします。したがって、矢印も参照を使用します。参照には矢に達するために 'deferred_'プロパティが必要であるが、それでも – CodingIntrigue

関連する問題