6

I am using Angular-datatable for showing data and its working fine with static data, but when if giving data dynamically its not working. Its taking my hard time.

What i want to achieve is to load data from ajax in datatable.

This following code i am using for initialization, and its working fine 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 = [];
}

This is following code not working check 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"
      }];

} 

I have also tried with dataresource Plunker but here also hard luck.

It already consumed my lot of time. So finally i decided to take advice from you all. Any help would be appreciated.

1 Answer 1

4

You've missed two points:

  1. The controller was not called because it was not added to markup. If you'll use ui-router later that's OK because then you can add the controller in the configuration.
  2. Your table was not populated because you missed to add the binding e.g. {{chapter.id}} and myChapters is not available in $scope because you're using controllerAs syntax.

Please have a look at the demo below or in this updated plunkr.

In the demo below I've only changed the $http.get(...) to $http.jsonp(...) to get the json data from mocky.io.

Update

To make the filter an pagination work you have to change the table markup to this.

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

Sign up to request clarification or add additional context in comments.

5 Comments

I got your point data is populating now problem is look at end Showing 0 to 0 of 0 entries and try to click on column all data will be gone. Why we are getting this issue.
Yes, I see the problem. But not sure how to fix. Let me have a look.
OK, I've found it. See my updated answer. I haven't updated it at Plunkr because I have a saving issue at plunkr at the moment.
Added datatable="ng" and controllerAs was missing. That's a bit confusing in the examples at the angular.datatable site. The showCase is their controllerAs name.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.