Ошибка" не удается установить свойство 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) дает правильный результат, поэтому я смущен, почему он показывает неопределенный. Пожалуйста, помогите!
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