angular.js:13550 TypeError:无法设置未定义的属性'people'

时间:2016-05-27 11:26:06

标签: javascript angularjs ecmascript-6

我正在学习角度+ ES6代码。

test.controller.js

class TestSecIndexController {

    constructor (TestSecService,$q) {
        this.src = require('./../images/2.jpg');
        this._TestSecService = TestSecService;
        let promises = [
            this.getPeopleList()
        ];    
        $q.all(promises).then(function (){
            console.log(this.people);
        })  
    }    
    getPeopleList(){
        return this._TestSecService.getPeopleList().then(function(res){
            this.people = res.data; //line: 22
        });
    }

    static testSecIndexController(TestSecService,$q){
        return new TestSecIndexController(TestSecService,$q);
    }    
}    

TestSecIndexController.testSecIndexController.$inject = ['TestSecService','$q'];    
export default angular.module ('test2.index.controller', [])
    .controller ('testSecIndexController', TestSecIndexController.testSecIndexController)

如果这样做,则会出现错误:

  

angular.js:13550 TypeError:无法设置未定义的属性'people'       在index.controller.js:22

this.src可以成功设置,为什么this.people不能?

2 个答案:

答案 0 :(得分:2)

你的范围是错误的。

  • this.src - 在这种情况下,this引用您正在构建的控制器类。
  • 第22行的
  • this.people引用了其中包含的函数。

我真的不知道角度,但你可能需要做类似的事情:

let promises = [
    this.getPeopleList()
];
let people = null;


getPeopleList(){
    let _this = this; //set _this equal to the parent scope
    return this._TestSecService.getPeopleList().then(function(res){
        //now _this.people refers to the already defined people of the constructor above
        _this.people = res.data; //line: 22 - 
    });
}

答案 1 :(得分:0)

有一种更好的方法可以使用新的ES6 lambda =>语法设置它的词法值。将代码更改为使用lambda,如下所示,您将获得this的正确值:

getPeopleList = () => {
    return this._TestSecService.getPeopleList().then(function(res){
        this.people = res.data; //line: 22
    });
}

this的值在constructor内被词法正确设置,但在类中的其他方法中没有。因此,您需要更改所有方法以使用=>来获得此

的正确词汇值