如何在AngularJS中通过AJAX加载数据后重新初始化数据表?

Posted

技术标签:

【中文标题】如何在AngularJS中通过AJAX加载数据后重新初始化数据表?【英文标题】:How do I re-initialize datatables AFTER data has loaded via AJAX in AngularJS? 【发布时间】:2015-10-11 11:16:57 【问题描述】:

我正在使用 AngularJS 和 Datatables 以及服务器端脚本通过 AJAX 获取数据。

我的控制器看起来像:

var currentJobId = $stateParams.jobId;
var selectedJobId = $rootScope.currentJob;

if (currentJobId !== selectedJobId) 
    $rootScope.currentJob=$stateParams.jobId;
    var data = 
        id: $stateParams.jobId
    
    $http.post('http://localhost/angular/scripts/getJob.php', data).success(function (thedata) 
        $scope.job = thedata.information;
        $scope.jobNotes = thedata.notes;
        $scope.jobMaterialUsage = thedata.materialUsage;
        $scope.jobItems = thedata.jobItems;
        $scope.jobSubcontractorCosts = thedata.subcontractorCosts;
        $scope.jobBondMiscCosts = thedata.bondMiscCosts;
        $scope.jobEmployeeTime = thedata.employeeTime;
    );

示例表如下所示:

<table class="table table-striped table-hover row-links" id="employeeTimeTable" ui-jq="dataTable" ui-options="tableOptions">
    <thead>
        <tr>
            <th>Employee Name</th>
            <th>Total Hours</th>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="time in jobEmployeeTime" ng-click="goToEmployee(job.id,time.id);">
            <td>time.name</td>
            <td>time.total_minutes</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th>Employee Name</th>
            <th>Total Hours</th>
        </tr>
    </tfoot>
</table>

所以它基本上是查看作业 ID 是否已更改,如果已更改,它会为新作业信息发出 ajax 调用 - 如果未更改,则不执行任何操作。我遇到的问题是,当我点击刷新时,在数据加载之前,我的表正在使用数据表进行初始化。离开页面并返回到它会正确初始化数据表,但是当通过 URL 直接进入页面或刷新时,它只是将数据放在表的顶部,同时仍然保持“表中没有可用的数据”并且没有数据表功能正常工作。

【问题讨论】:

您确定条件currentJobId !== selectedJobId 中的变量按预期工作吗?考虑删除 if (currentJobId !== selectedJobId) 进行测试 您应该创建自己的指令来初始化数据表并与之交互,并能够正确使用它的 API,或者最好使用已经存在的 API。一个插件太复杂了,不能简单地放入ui-jq标签并且无法控制它 是的,他们正在工作。其实放一个简单的 $state.go($state.current, , reload: true);在 $scope.jobEmployeeTime = thedata.employeeTime 之后;在帖子中修复了刷新问题(因为它正在刷新视图)......但是如果我将其用作解决方案,我会遇到其他问题。 还可以考虑使用角度网格系统,该系统可提供您想要的数据表功能集 【参考方案1】:

使用Angular ui-router,您可以在调用状态控制器之前解析后端数据。

请看下面的演示或jsFiddle。

它没有数据表,但这可能是更容易添加的部分。

(function() 
'use strict';

angular.module('demoApp', ['ui.router', 'angularSpinner'])
    .run(StartUp)
    .factory('jobsDataService', JobsDataFactory)
    .config(Config);

function JobsDataFactory($http) 
    var backendUrl = 'http://jsonplaceholder.typicode.com';
    
    return 
        get: function(id) 
            return $http.jsonp(backendUrl + '/posts/'+id +'?callback=JSON_CALLBACK')
                .then(function(response) 
                    return response.data;
            );
        
    ;


function Config($urlRouterProvider, $stateProvider) 
    $urlRouterProvider.otherwise('/jobs/1');
    
    $stateProvider
        .state('jobs',
               
                   url: '/jobs/:id',
                   templateUrl: 'partials/post.html',
                   resolve: 
                       job: function(jobsDataService, $stateParams) 
                           console.log($stateParams.id);
                           return jobsDataService.get($stateParams.id);
                       
                   ,
                   controller: function($scope, job) 
                       console.log(job);
                       $scope.job = job;
                   
               );


function StartUp($rootScope)
    // only used for loading spinner
    $rootScope
        .$on('$stateChangeStart', 
            function(event, toState, toParams, fromState, fromParams) 
                $rootScope.loading = true;
        );

    $rootScope
        .$on('$stateChangeSuccess',
            function(event, toState, toParams, fromState, fromParams) 
                $rootScope.loading = false;
        );


    
)();
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.3/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/spin.js/2.3.1/spin.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-spinner/0.6.2/angular-spinner.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>

<div ng-app="demoApp">
    <span us-spinner="" ng-if="loading"></span>
    <a href="#" ui-sref='jobs(id: 1)'>job 1</a>
    <a href="#" ui-sref='jobs(id: 2)'>job 2</a>
    <a href="#" ui-sref='jobs(id: 3)'>job 3</a>
    <div ui-view=""></div>
    
    <script type="text/ng-template" id="partials/post.html">
        <p>debug id = job.id</p>
        <h1>job.title</h1>
        <p>job.body</p>
    </script>
</div>

【讨论】:

以上是关于如何在AngularJS中通过AJAX加载数据后重新初始化数据表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在此 Codeigniter 应用程序中通过 jQuery Ajax 加载特定数据,而不是整个页面?

如何使用正确的字符编码在 jQueryMobile 1.3.1 中通过 AJAX 加载 ISO-8859-1 内容?

如何在 ASP.NET MVC 中通过 Ajax 提交表单?

在 Rails 中通过 AJAX 加载更多用户电影

在 jQueryUI 选项卡中通过 AJAX 加载 Google 可视化

在 Laravel 中通过 ajax 加载更雄辩的 hasMany 关系查询?