Using full featured Datatables Plugin with Angular 6

前端 未结 8 1528
[愿得一人]
[愿得一人] 2020-12-09 12:36

I am trying to add Datatables plugin (datatables.net) facility with my angualar 6 project. I am not sure how should I include the necessary css, js and other required files

相关标签:
8条回答
  • 2020-12-09 13:08

    Just add your .css files in styles section and .js files in Scripts section, in angular(-cli).json. I think this would resolve your issues.

    0 讨论(0)
  • 2020-12-09 13:13

    By just watching the question and the answer from @dickrichie, I still had an error:

    ERROR in node_modules/angular-datatables/src/angular-datatables.directive.d.ts(1
    ,23): error TS2688: Cannot find type definition file for 'datatables.net'.
    node_modules/angular-datatables/src/angular-datatables.directive.d.ts(15,16): er
    ror TS2503: Cannot find namespace 'DataTables'.
    node_modules/angular-datatables/src/angular-datatables.directive.d.ts(27,25): er
    ror TS2503: Cannot find namespace 'DataTables'.
    

    I was missing the two last install steps to make Datatables.net works with Angular 6.

    npm install jquery --save
    npm install datatables.net --save
    npm install datatables.net-dt --save
    npm install angular-datatables --save
    npm install @types/datatables.net --save-dev
    

    Then follow the message from @dickrichie to edit angular.json and app.module.ts files. Now any table tag where you add "datatable" should work.

    -- EDIT

    The first part of that answer is with using angular-datatables, but as @fahimuddin asked in fact how to do that without that package, I tried differently.

    So no need to install the last two packages, the angular.json looks the same as in @dickrichie answer and in a component I just added before the @Component:

    declare var $: any;
    

    And then use directly jQuery and Datatables in ngOnInit():

    $('#your-datatable-id').DataTable();
    

    It works and nobody's complaining but I'm not sure if it's a good practice? (And as in my case I'm trying to do an Angular-Electron app, it's still not working in Electron, it wasn't working with angular-datatable neither, but that's another problem!)

    0 讨论(0)
  • 2020-12-09 13:14

    import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
    import { ToastrManager } from 'ng6-toastr-notifications';
    import { environment } from 'src/environments/environment';
    import { HttpClient, HttpParams } from '@angular/common/http';
    import { LoginService } from '../login.service';
    declare var $;
    
    class SiteModal {
      OrderNumber: string;
      ContactName: string;
      EntityName: string;
      ContactNo: string;
      CategoryName: string;
      StatusName: string;
    }
    
    class DataTablesResponse {
      data: any[];
      draw: number;
      recordsFiltered: number;
      recordsTotal: number;
    }
    
    
    @Component({
      selector: 'app-site',
      templateUrl: './site.component.html',
      styleUrls: ['./site.component.scss']
    })
    
    
    
    export class SiteComponent implements OnInit {
      @ViewChild('dataTable') table: ElementRef;
      dataTable: any;
      dtOptions: DataTables.Settings = {};
      siteModal: SiteModal[];
      dataTablesResponse: DataTablesResponse[];
      datatable: any;
      public data: Object;
      public temp_var: Object = false;
    
      constructor(
        private http: HttpClient,
        public toastr: ToastrManager,
        private LoginService: LoginService
      ) { }
    
    
    
      ngOnInit(): void {
        const that = this;
      
        this.dtOptions = {
          pagingType: 'full_numbers',
          pageLength: 10,
          serverSide: true,
          processing: true,
          ordering: false,
          searching: false,
    
    
          ajax: (dataTablesParameters: any, callback) => {
            let params = new HttpParams();
            let startNumber: any;
    
            startNumber = dataTablesParameters.start;
            if (startNumber != 0) {
              startNumber = startNumber + 1
            } else {
              startNumber = startNumber;
            }
            params = params.append("start", startNumber);
            params = params.append("length", dataTablesParameters.length);
            let param = params.toString();
            setTimeout(() => {
              $(".dataTables_empty").hide();
            }, 500);
            that.http
              .post<DataTablesResponse>(
                environment.apiUrl + "api/Entity/GetSiteList",
                params, {}
              ).subscribe(resp => {
                that.siteModal = resp.data;
                debugger
                setTimeout(() => {
                  $(".dataTables_empty").hide();
                }, 500);
                callback({
                  recordsTotal: resp.recordsTotal,
                  recordsFiltered: resp.recordsFiltered,
                  data: []
                });
              });
          },
          columns: [{ data: 'OrderNumber' }, { data: 'ContactName' }, { data: 'EntityName' }, { data: 'ContactNo' }, { data: 'StatusName' }, { data: 'CategoryName' }]
        };
    
    
      }
    
    }
    <section class="content-header ng-scope">
            <h1>Site </h1>
        </section>
        
        <section class="content">
            <div class="panel panel-default">
                <div class="panel-body">
                    <div class="row">
                        <div class="col-md-12 table-responsive">
                            <table id='Clienttbl' datatable [dtOptions]="dtOptions" class="row-border hover">
                                <thead>
                                  <tr>
                                    <th>Order #</th>
                                    <th>ContactName</th>
                                    <th>Entity Name</th>
                                    <th>ContactNo</th>
                                    <th>StatusName</th>
                                    <th>Category Name</th>
                                  </tr>
                                </thead>
                                <tbody *ngIf="siteModal?.length != 0">
                                    <tr *ngFor="let data of siteModal">
                                        <td>{{ data.OrderNumber }}</td>
                                        <td>{{ data.ContactName }}</td>
                                        <td>{{ data.EntityName }}</td>
                                        <td>{{ data.ContactNo }}</td>
                                        <td>{{ data.StatusName }}</td>
                                        <td>{{ data.CategoryName }}</td>
                                    </tr>
                                </tbody>
                              
                              </table> 
        
                        </div>
                    </div>
                </div>
            </div>
        </section>
        
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

    0 讨论(0)
  • 2020-12-09 13:15

    Adding DataTablesModule.forRoot() in imports of appmodule.ts works! Or if you are using a lazy loading remember to put it in every module.ts

    0 讨论(0)
  • 2020-12-09 13:18

    You need to do changes into angular.json file:

    "styles": [
        ...
        "node_modules/datatables.net-bs4/css/dataTables.bootstrap4.min.css",
        ...
    ],
    "scripts": [
        ...
        "node_modules/datatables.net/js/jquery.dataTables.js",
        "node_modules/datatables.net-bs4/js/dataTables.bootstrap4.min.js"
        ...
    ]
    
    

    And the same way for extensions plugins.

    0 讨论(0)
  • use angular data tables in Angular 6 angular-datatables

    You need to install its dependencies before getting the latest release using NPM:

    npm install jquery --save
    npm install datatables.net --save
    npm install datatables.net-dt --save
    npm install angular-datatables@6.0.0 --save
    npm install @types/jquery --save-dev
    npm install @types/datatables.net --save-dev
    

    angular.json

    Import the DataTablesModule in app.module.ts

    import { DataTablesModule } from 'angular-datatables';
    
    imports: [
        DataTablesModule
      ],
    

    my datatableslibrary.ts

    import { Component, OnDestroy, OnInit } from '@angular/core';
    import { Http, Response } from '@angular/http';
    import { Subject } from 'rxjs';
    import { HttpClient } from '@angular/common/http';
    import { DataService } from '../data.service';
    
    @Component({
      selector: 'app-datatableslibrary',
      templateUrl: './datatableslibrary.component.html',
      styleUrls: ['./datatableslibrary.component.css']
    })
    export class DatatableslibraryComponent implements OnInit, OnDestroy {
    
      users$: any[] = [];
      dtOptions: DataTables.Settings = {};
      dtTrigger: Subject<any> = new Subject();
    
      constructor(private http: HttpClient, private data: DataService) {
      }
    
      ngOnInit() {
        this.dtOptions = {
          pagingType: 'full_numbers',
          pageLength: 5,
          processing: true
        };
        this.data.getUsers().subscribe(data => {
          this.users$ = data;
          this.dtTrigger.next();
        });
      }
    
      ngOnDestroy(): void {
        this.dtTrigger.unsubscribe();
      }
    
    }
    

    my datatableslibrary.component.html

    <table class="table table-striped table-bordered table-sm row-border hover" datatable [dtOptions]="dtOptions"
      [dtTrigger]="dtTrigger">
      <thead>
        <tr>
          <th>Name</th>
          <th>Email</th>
          <th>Website</th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let user of users$">
          <td>{{ user.name }}</td>
          <td>{{ user.email }}</td>
          <td>{{ user.website }}</td>
        </tr>
      </tbody>
    </table>
    

    0 讨论(0)
提交回复
热议问题