Угловой Datatable не работает с данными

я использую угловой-datatable для отображения данных и его работы со статическими данными, но когда динамическое предоставление данных не работает. Это отнимает у меня много времени.

чего я хочу достичь, это загрузить данные из ajax на datatable.

следующий код я использую для инициализации, и его работает нормально Plunker:

function MyChapterController($scope, $q, DTOptionsBuilder, DTColumnBuilder, chapter) {
    var vm = this;     

    vm.dtOptions = DTOptionsBuilder.newOptions()
        .withPaginationType('full_numbers')
        .withDisplayLength(2)
        .withDOM('pitrfl');
    vm.dtColumns = [
        DTColumnBuilder.newColumn('id').withTitle('ID'),
        DTColumnBuilder.newColumn('title').withTitle('First name'),
        DTColumnBuilder.newColumn('lastName').withTitle('Last name').notVisible()
    ];

    vm.myChapters = [];
}

Это следующий код не работает проверка Plunker:

function MyChapterController($scope, $q, $resource, DTOptionsBuilder, DTColumnBuilder, chapter) {
    var vm = this;     

    vm.dtOptions = DTOptionsBuilder.newOptions()
        .withPaginationType('full_numbers')
        .withDisplayLength(2)
        .withDOM('pitrfl');
    vm.dtColumns = [
        DTColumnBuilder.newColumn('id').withTitle('ID'),
        DTColumnBuilder.newColumn('title').withTitle('First name'),
        DTColumnBuilder.newColumn('lastName').withTitle('Last name').notVisible()
    ];

    vm.myChapters = [{
          "id": 860,
          "firstName": "Superman",
          "lastName": "Yoda"
      }, {
          "id": 870,
          "firstName": "Foo",
          "lastName": "Whateveryournameis"
      }, {
          "id": 590,
          "firstName": "Toto",
          "lastName": "Titi"
      }, {
          "id": 803,
          "firstName": "Luke",
          "lastName": "Kyle"
      }];

} 

Я также пробовал с dataresource Plunker но и тут не повезло.

Это уже отняло у меня много времени. В конце концов я решил воспользоваться вашим советом. Любая помощь будет оценена.

1 ответов


вы пропустили два момента:

  1. контроллер не вызывался, потому что он не был добавлен в разметку. Если вы будете использовать ui-router позже это нормально, потому что тогда вы можете добавить контроллер в конфигурацию.
  2. ваша таблица не была заполнена, потому что вы пропустили добавление привязки, например {{chapter.id}} и myChapters недоступен в $scope потому что вы используете controllerAs синтаксис.

пожалуйста, посмотрите на демо ниже или в этой обновленной plunkr.

в демо ниже, я только изменил $http.get(...) to $http.jsonp(...) чтобы получить данные json от моки.io.

обновление

чтобы сделать фильтр разбиением на страницы, вы должны изменить разметку таблицы на это.

<table datatable="ng" dt-options="chapterCtrl.dtOptions" dt-column-defs="chapterCtrl.dtColumnDefs" id="cb-mychapter-table" class="row-border hover table table-bordered cb-data-table" cellspacing="0" width="100%">

// Code goes here
'use strict';

angular.module('myApp', ['datatables','ngResource']);

(function (angular) {
    'use strict';

    angular
            .module('myApp')
            .controller('myChapterController', MyChapterController)
            .factory('chapter', ChapterFactory);

    MyChapterController.$inject = ['$scope', '$q', '$resource', 'DTOptionsBuilder', 'DTColumnBuilder', 'chapter'];

    function MyChapterController($scope, $q, $resource, DTOptionsBuilder, DTColumnBuilder, chapter) {
        var vm = this;     
        
        vm.dtOptions = DTOptionsBuilder.newOptions()
            .withPaginationType('full_numbers')
            .withDisplayLength(2)
            .withDOM('pitrfl');
        vm.dtColumns = [
            DTColumnBuilder.newColumn('id').withTitle('ID'),
            DTColumnBuilder.newColumn('title').withTitle('First name'),
            DTColumnBuilder.newColumn('lastName').withTitle('Last name').notVisible()
        ];
        
        /*vm.myChapters = [{
              "id": 860,
              "firstName": "Superman",
              "lastName": "Yoda"
          }, {
              "id": 870,
              "firstName": "Foo",
              "lastName": "Whateveryournameis"
          }, {
              "id": 590,
              "firstName": "Toto",
              "lastName": "Titi"
          }, {
              "id": 803,
              "firstName": "Luke",
              "lastName": "Kyle"
          }];*/
        
        chapter.getChapters().then(function(chapters) {
          vm.myChapters = chapters;
        });
    }
    
  ChapterFactory.$inject = ["$http"];
  
  function ChapterFactory($http) {
   return {
     getChapters: function() {
       return $http.jsonp('http://www.mocky.io/v2/55f2b4cb0938f5cd069cff10?callback=JSON_CALLBACK').then(function(response) {
         console.log(response);
         return response.data;
       });
     }
   };
  }
  
}(angular));
<!DOCTYPE html>
<html ng-app='myApp'>

  <head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <!--<link rel="stylesheet" href="style.css">-->
    
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
    <script type="text/javascript" charset="utf8" src="//cdn.datatables.net/1.10.9/js/jquery.dataTables.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular.min.js"></script>
    <script src="https://cdn.rawgit.com/l-lin/angular-datatables/dev/dist/angular-datatables.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular-resource.min.js"></script>
    <!--<script src="script.js"></script>-->
  </head>

  <body ng-controller="myChapterController as chapterCtrl" >
    <table datatable="ng" dt-options="chapterCtrl.dtOptions" dt-column-defs="chapterCtrl.dtColumnDefs" id="cb-mychapter-table" class="row-border hover table table-bordered cb-data-table" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>ID</th>
                <th>FirstName</th>
                <th>LastName</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="chapter in chapterCtrl.myChapters">
                <td>{{chapter.id}}</td>
                <td>{{chapter.firstName}}</td>
                <td>{{chapter.lastName}}</td>
            </tr>
        </tbody>
    </table>
  </body>

</html>