簡體   English   中英

在AngularJS中通過AJAX加載數據后,如何重新初始化數據表?

[英]How do I re-initialize datatables AFTER data has loaded via AJAX in AngularJS?

我正在使用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直接進入頁面或刷新時,只需將數據放在表的頂部,同時仍然保持“表中沒有數據”而沒有數據表功能正常工作。

使用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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM