我有这个ES6类,当this.categories = data.data
执行错误TypeError: Cannot set property 'categories' of undefined
时失败。
我认为这是由于this
引用了承诺中的上下文。
如何在承诺内设置this.categories
?
感谢。
class NavbarController {
constructor(bnCategoryService) {
this.categories = []; // This is what should be set with data.data.
this.bnCategoryService = bnCategoryService;
this.getCategories();
}
getCategories() {
this.bnCategoryService.getCategories() // Returns a promise
.success(function(data, status, headers, config) {
console.log(data.data);
this.categories = data.data; // This fails!
})
.error(function(data, status, headers, config) {
console.log('Category service: An error occured getting tags from the server.');
});
}
}
答案 0 :(得分:5)
只需在成功处理程序中使用箭头函数即可获得词法this
绑定:
.success((data, status, headers, config) => {
console.log(data.data);
this.categories = data.data; // This won't fail!
})
答案 1 :(得分:1)
即使您的代码实现了ECMA-Script 6 类,也并不意味着this
关键字仍具有不同的含义,具体取决于范围。
在success
处理程序中,this
将不是您当前的类实例。
重构整个代码以在调用保存this
值的异步操作之前声明变量,然后在success
处理程序中使用整个变量:
// This variable holds the "this" value from the class function scope.
var that = this;
this.bnCategoryService.getCategories() // Returns a promise
.success(function(data, status, headers, config) {
console.log(data.data);
that.categories = data.data; // This fails!
})
.error(function(data, status, headers, config) {
console.log('Category service: An error occured getting tags from the server.');
});