javascript - Angular UI-Grid TypeError : Cannot set property 'data' of undefined. 发送来自服务的 promise 和未定义的数据

标签 javascript json angularjs ng-grid angular-ui-grid

我正在探索 Angular.js UI-Grid。但是,当我在我的服务中发出 HTTP 请求时,我似乎无法弄清楚为什么数据未定义。当我从我的 Controller 发出 HTTP 请求时,它似乎工作正常。如何使 Ui-Grid 以模块化方式工作?

HTML

<div id="grid1" ui-grid="gridOptions" class="grid"></div>

Controller

app.controller('tableCtrl', function($scope, tableService) {

    var getAllArtistData = function() {

        tableService.getArtistData().then(function(data) {
            console.log("this is controller data", data);
            $scope.gridOptions.data = data;

            $scope.gridOptions = {};

            $scope.gridOptions.columnDefs = [
                {name:'artist_id'},
                {name:'first_name'}
            ];

            });
        };
    getAllArtistData();
});

服务

app.service('tableService', function($http, $q) {

    /************************************************
    GET ARTIST DATA 
    ************************************************/
    this.getArtistData = function() {

        var defer = $q.defer();

        $http.get('../../../data/artists-lite.json')
            .success(function(response) {
                console.log("this is response", response);
                defer.resolve(response);
            })
            .error(function(err) {
                defer.reject(err);
            });

        return defer.promise;

    };
});

App.js

'use strict';

var app = angular.module('bucketfeet', ['ui.router','ui.grid', 'ngAnimate']);

app.run(function($state, $rootScope) {
    $rootScope.$state = $state;
});

app.config(function($stateProvider, $urlRouterProvider) {

    $urlRouterProvider
    .otherwise('/');

    $stateProvider
    .state('stats', 
        {
            url: '/stats',
            templateUrl: './js/views/statsTmpl.html'
        })
    .state('table', 
        {
            url: '/table',
            templateUrl: './js/views/tableTmpl.html',
            controller: 'tableCtrl'
        });

});

最佳答案

在你的 Controller 中你应该在使用它之前初始化你的gridOptions。更好的是,尝试将此变量的设置提取到 Controller 范围,只留下异步方法中的数据:

app.controller('tableCtrl', function($scope, tableService) {

    // Initialize gridOptions with all the properties, except for data
    $scope.gridOptions = {};
    $scope.gridOptions.columnDefs = [
        {name:'artist_id'},
        {name:'first_name'}
    ];
    $scope.gridOptions.data = [];

    var getAllArtistData = function() {

        tableService.getArtistData().then(function(data) {
            console.log("this is controller data", data);

            // fill only data in asynchronous callback
            $scope.gridOptions.data = data;
        });
    };
    getAllArtistData();
});

方法 tableService.getArtistData() 异步执行,此方法的回调仅在从服务器检索数据时执行。这可能在几毫秒内发生,也可能在几分钟内发生。网格的渲染需要在回调执行之前发生,缺少如何渲染网格的元数据信息。这就是为什么我建议在启动异步调用之前初始化网格元数据,并且在回调中仅设置数据。

关于javascript - Angular UI-Grid TypeError : Cannot set property 'data' of undefined. 发送来自服务的 promise 和未定义的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32941167/

相关文章:

javascript - 正则表达式本地路径文件验证

PHP:用于存储在 MySQL 数据库中的 json_encode 与序列化?

python - 我怎样才能使用 Python 从 https 链接获取 JSON?

javascript - Protractor 和 Karma 可以一起使用吗?

javascript - 当 onInit 钩子(Hook)被多次调用时,如何在 Angular 1.5 中仅调用一次特定的 Promise

javascript - 将坐标转换为等距坐标,反之亦然不起作用

javascript - Safari 12.1 中跨域 iframe 麦克风权限发生变化?

javascript - 内容的历史可编辑的替代品

javascript - 相关下拉列表 state 、 city 和 pincode

angularjs - ASP.NET MVC Razor View 与 AngularJS