角度 UI-网格类型错误:无法设置未定义的属性"data"。从服务和未定义的数据发送承诺



我正在探索Angular.js UI-Grid。然而,当我在我的服务中发出HTTP请求时,我似乎不能弄清楚为什么数据是未定义的。当我从控制器发出HTTP请求时,它似乎工作得很好。我如何使Ui-Grid工作在一个模块化的方式?

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

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

在您的控制器中,您应该在使用gridOptions之前初始化它。更好的做法是,尝试将该变量的设置提取到控制器范围,只在异步方法中填充数据:

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()异步执行,并且该方法的回调仅在从服务器检索数据时执行。这可以在几毫秒内发生,也可以在几分钟内发生。网格的呈现需要在回调执行之前进行,并且它缺乏如何呈现网格的元数据信息。这就是为什么我建议在启动异步调用之前初始化网格元数据,并在回调中只设置数据。

最新更新