2016-06-29 18 views
0

Ich brauche Hilfe für meine Probleme zu lösen. Ich habe Probleme mit Anrufdaten vom Backend. Bitte sagen Sie mir, wie ich die Daten vom Backend bekommen kann.TypeError: Die Eigenschaft 'length' von undefined kann nicht gelesen werden. Meine Daten können nicht geladen werden

TypeError: Cannot read property 'length' of undefined

ich denke, ich habe Probleme mit meinem Controller, um die Daten zu laden.

api

application.factory('API', ['Settings', 
    function(Settings) 
    { 
     var api = {}; 

     api.projects     = '/ppr/resource/misbactivecaseJPA'; 

     api.get = function(endpoint) 
     { 
      return Settings.host.concat(api[endpoint]); 
     }; 

     return api; 
    } 

]);

Service

application.factory('Project', ['$resource', 'API', 
    function($resource, API) 
    { 
     return $resource(API.get('projects'), { 
      Id: '@id', 
     }, { 
      delete: { 
       method: 'DELETE', 
      }, 
      get: { 
       method: 'GET', 
      }, 
      save: { 
       method: 'POST', 
      }, 
      query: { 
       method: 'GET', 
       isArray: true, 
      }, 
      update: { 
       method: 'PUT', 
      }, 
     }); 
    }]); 

Controller

application.controller('Property_ProjectController', ['$location', '$scope', '$mdDialog' , '$mdMedia', 'Project', 
     function($location, $scope, $mdDialog, $mdMedia, Project) 
     { 
      $scope.limit = 50; 
      $scope.page = 0; 
      $scope.projects = []; 

      $scope.query = { 
       $: '', 
      }; 

      $scope.load = function() 
      { 
       var options = {}; 
       options.limit = $scope.limit; 
       if (++$scope.page > 1) options.skip = $scope.limit * ($scope.page - 1); 
       Project.query(options).$promise 
        .then(function(projects) 
        { 
         if (projects.data.length < 1) return; 
         $scope.projects = $scope.projects.concat(projects.data); 
         $scope.load(); 
        }); 
      }; 

      $scope.load(); 

html

<tbody> 
    <tr ng-repeat="projects in data = (projects | filter:query:regex | orderBy:'name')"> 
     <td>{{ projects.name }}</td> 
     <td>{{ projects.code }}</td> 
     <td>{{ projects.description }}</td> 
     <td>{{ projects.address }}</td> 
     <td>{{ projects.ProjectId }}</td> 
     <td><md-button class="md-icon-button" 
         ng-click="AddProject($event)" 
         aria-label="{{ 'action_edit' | translate }}"> 
       <md-tooltip>{{ 'action_edit' | translate }}</md-tooltip> 
       <md-icon>edit</md-icon> 
      </md-button> 
     </td> 
    </tr> 
</tbody> 

Antwort

0

Es gibt nur eine Linie in Ihrem Controller, der die .length Eigenschaft verwendet, die die Zeilennummer 20 ist. Das Problem ist projects.data ist undefined, daher zeigt es den Fehler Cannot read property length of projects.data since it is undefined. Somit hat projects Objekt kein Attribut data seit projects.data ist undefiniert.

+0

Also, was muss ich tun, um diesen Fehler zu lösen, Entschuldigung für die Frage. Ich muss nur diese Probleme lösen. Ich brauche viele Stunden, um das zu lösen. aber kann immer noch nicht arbeiten. kannst du mir den code und teil zeigen muss ich ändern. –

+0

Wie die Antwort besagt, ist 'projects.data' nicht definiert. Sie müssen also überprüfen, was die API zurückgibt. warum könnte es sein, dass es etwas undefiniertes zurückgibt, oder sogar es ist in Ordnung, wenn es eine Eigenschaft mit dem Namen 'data' erwartet (kannst du sicherstellen, dass es existiert?). – Pipetus

+0

Sie müssen Ihre API für diesen Zweck überprüfen. –

0

Sie können vielleicht versuchen, einen Erfolg Rückruf verwenden, anstatt ein „dann“ das Versprechen Befestigung:

var ps = Project.query(options, function() { 
    if (ps.length < 1) return; 
    $scope.projects = $scope.projects.concat(ps); 
    $scope.load(); 
}); 

„ps“ sollte ein Array (zunächst leer) sein und sollte durch die Zeit der Rückruf definiert werden Funktion wird aufgerufen.

Verwandte Themen