Ошибка" не удается установить свойство undefined " в AngularJS [дубликат]



На этот вопрос уже есть ответ здесь:



Я новичок в Angular, поэтому я думаю, что совершаю какую-то глупую ошибку, но все еще не могу ухватить ее.
Я создал сервис для извлечения некоторых данных, а затем ввел этот сервис в свой контроллер.



Обслуживание -



  .service('getAllCompanies', ['$http', function ($http) {
// AngularJS will instantiate a singleton by calling "new" on this function
var url = "http://localhost:8000/companies/?page=";
this.getCompanies = function(p) {
return $http.get(url+p);
};
}]);


Контроллер -



.controller('CompaniesallCtrl', ['getAllCompanies', function (companiesService) {
var pageNumber = 1;
this.companiesNumber = "";
companiesService.getCompanies(pageNumber)
.then(function(response){
console.log(response.data.count);
this.companiesNumber = response.data.count;
}, function(error) {
console.log(error);
})
}]);


Я получаю эту ошибку в консоли -



TypeError: Cannot set property 'companiesNumber' of undefined
at companiesall.js:17
at processQueue (angular.js:16170)
at angular.js:16186
at Scope.$eval (angular.js:17444)
at Scope.$digest (angular.js:17257)
at Scope.$apply (angular.js:17552)
at done (angular.js:11697)
at completeRequest (angular.js:11903)
at XMLHttpRequest.requestLoaded (angular.js:11836)


Консоль.log (ответ.данные.count) дает правильный результат, поэтому я смущен, почему он показывает неопределенный. Пожалуйста, помогите!

486   2  

2 ответов:

Можно также задать контроллер в качестве переменной в области действия функции.

Что-то вроде:

.controller('CompaniesallCtrl', ['getAllCompanies', function (companiesService) {
    var pageNumber = 1;
    var ctrl = this;
    ctrl.companiesNumber = "";
    companiesService.getCompanies(pageNumber)
        .then(function(response){
            console.log(response.data.count);
            ctrl.companiesNumber = response.data.count;
        }, function(error) {
           console.log(error);
        }) 
}]);

Полагаю, вы используете строгий режим ? Тогда контекст внутри then обратного вызова будет глобальным объектом, но this действительно undefined. Используйте функцию arrow , которая сохранит лексическую область (экземпляр контроллера в данном случае):

companiesService.getCompanies(pageNumber)
    .then(response => {
        console.log(response.data.count);
        this.companiesNumber = response.data.count;
    }, function(error) {
        console.log(error);
    })

Или привязка к правильному контексту:

companiesService.getCompanies(pageNumber)
    .then(function(response) {
        console.log(response.data.count);
        this.companiesNumber = response.data.count;
    }.bind(this), function(error) {
        console.log(error);
    })

Comments

    Ничего не найдено.