#javascript #angularjs
#javascript #angularjs
Вопрос:
Я изучаю AngularJS и сталкиваюсь с проблемой после изменения этой функции:
gList : function (){
return List
},
С помощью этого:
gList : function() {
$http({method:'GET',url:'/sessions'}).
success(function(data){
return data;
}).
error(function(data){
$log.info(data);
})},
И теперь я получаю эту ошибку:
Uncaught TypeError: Cannot read property 'sheet' of null
(anonymous function) modernizr-2.6.2.min.js:4
y modernizr-2.6.2.min.js:4
s.fontface modernizr-2.6.2.min.js:4
(anonymous function) modernizr-2.6.2.min.js:4
(anonymous function) modernizr-2.6.2.min.js:4
Здесь вызывается функция:
$scope.sessions = Sessions.gList();
Затем
ng-repeat="session in sessions"
Хотя я даже не использую sheet
его в своем коде. Помогите?
Комментарии:
1. ну, какая-то часть кода (где-то), очевидно, нуждается в возвращаемом значении из вашей старой функции при ее вызове. ваша новая функция (может) вернуть некоторое значение в более поздний момент времени. до этого все, что возвращал старый метод, теперь равно null.
2. @DatProgram Функция вызывается здесь: $scope.sessions = Sessions.GList(); Не будет ли он пытаться оценить функцию?
3. Вы пробовали использовать отладчик javascript, чтобы найти место, где он попадает в переменную «sheet»?
4. Ну, это указывает мне сюда (анонимная функция) modernizr-2.6.2.min.js: 4 y modernizr-2.6.2.min.js: 4 s.fontface modernizr-2.6.2.min.js: 4 (анонимная функция) modernizr-2.6.2.min.js: 4 (анонимная функция) modernizr-2.6.2.min.js: 4 (анонимная функция) modernizr-2.6.2.мин.js: 4
5. как только вы это сделаете
$scope.sessions = Sessions.gList();
, это запустит процесс дайджеста и всякий раз, когда у вас есть $scope.sessions. sheet или где-то в вашем html, который у вас есть, т.е. `{{сеансы. sheet}} вы получите эту ошибку, вы должны использовать promises здесь для достижения правильной функциональности
Ответ №1:
Проблема здесь в том, что в то время, когда ваш http-запрос получил ответ, сеансы ng-repeat в скрипте уже вызывались. Это означает, что значение сеансов равно null, и я думаю, что вы пытаетесь получить доступ к {{ session .sheet }} в вашем HTML, который не определен, и поэтому браузер сообщает вам. Решением такой проблемы является использование $ q.defer.resolve() и $ q.defer.reject() для http-ответа и ошибки. Затем передайте через $ q.обещание. Пример приведен ниже :
.service('httpService' , ['$http','$q', function($http, $q) ]{
$http(sendConfig).then(function(response) {
deferred.resolve(response);
}, function(response) {
deferred.error(response);
}, function(message) {
deferred.notify(message);
});
return deferred.promise;
});
И в контроллере попытайтесь получить доступ к этому
httpService().then(function(res){
$scope.sessions = res;
});