Неперехваченная ошибка типа: не удается прочитать свойство ‘sheet’ с нулевым значением

#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;
});