【问题标题】:TypeError: Cannot read property 'length' of undefined. my data cannot loadTypeError:无法读取未定义的属性“长度”。我的数据无法加载
【发布时间】:2016-06-29 02:53:53
【问题描述】:

我需要帮助来解决我的问题。我对来自后端的呼叫数据有疑问。请告诉我如何从后端获取数据。

TypeError: 无法读取未定义的属性“长度”

我认为我的控制器无法加载数据。

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

]);

服务

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',
            },
        });
    }]);

控制器

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>

【问题讨论】:

    标签: angularjs json html controller


    【解决方案1】:

    控制器中只有一行使用.length 属性,即行号20。问题是projects.dataundefined,因此它显示错误Cannot read property length of projects.data since it is undefined。因此,projects 对象没有属性 data,因为 projects.data 未定义。

    【讨论】:

    • 所以现在我必须做些什么来解决这个错误,很抱歉问你。我只需要解决这个问题。我花了很多时间来解决这个问题。但仍然无法工作。你能告诉我代码吗?我必须改变的部分。
    • 如答案所述,projects.data 未定义,因此您必须检查 API 返回的内容;为什么它会返回一些未定义的东西,或者它甚至可以期待一个名为 data 的属性(你能确保它存在吗?)。
    • 您需要为此检查您的 API。
    • 我已经使用邮递员检查 API。数据已经显示。但我不知道为什么我的角度不起作用。现在我尝试为这部分创建新的 API。
    【解决方案2】:

    您或许可以尝试使用成功回调而不是在 promise 上附加“then”:

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

    “ps”应该是一个数组(最初为空),并且应该在回调函数被调用时定义。

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 2021-12-05
      • 2020-07-20
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多