私は、作成時にデータを要求するコンポーネントを持っています。しかし、データが返されたときには、これに直接アクセスすることはできません。Vue.jsメソッド内でスコープを失う
// Service
class DataService {
getDataFromService() {
var p = new Promise(function(resolve, reject) {
resolve({ message: 'hello world' });
});
return p;
}
}
var dataService = new DataService();
// Component
Vue.component('review', {
created: function() {
this.fetchData();
},
methods: {
fetchData: function() {
var that = this;
var hello = 'world';
// normal function
dataService.getDataFromService().then(function(data) {
this.foo = data.message; // 'this' is undefined
that.bar = data.message; // 'that' is undefined
console.log(hello); // 'hello' is undefined
});
// fat arrow
dataService.getDataFromService().then((data) => {
this.foo = data.message; // 'this' is undefined
that.bar = data.message; // 'that' is undefined
console.log(hello); // 'hello' is undefined
});
},
},
});
上記の例では、 'this'と 'that'の両方は定義されていません。理由はわかりません。私はコードをコンパイルするためにブラウザ&を使用しています。
何も変更していない約束の代わりにコールバックを使用するようにサービスを変更しようとしました。私はまた、太い矢印の代わりに通常の "関数(データ)"を使用しようとしました。
更新: 例はJSFiddleで機能します。私はこれがbabel/browserify/modulesと関係があることを意味していると推測しています。矢印の機能を使用して
ES6の構文にアクセスできるため、関数リテラルを使用しないと時間がかかることがあります。 – christopher
私は標準と太い矢印の両方の機能を試しました。どちらも違いはありませんでした。私はこの情報を含むように質問を更新しました。 –
'this'は、非矢印関数の' that'とは異なる値を持っていたと理解できますが、 'hello'は未定義です。環境に重大なバグがあることを意味します。この動作はJavaScriptでは許可されていません。 – Bergi