2017-06-27 1 views
3

Ich arbeite mit mehreren angularjs-Datentabellen und erzeuge eine neue Tabelle jedes Mal, wenn der Benutzer eine Option aus der Dropdown-Liste auswählt.Auf der Basis der Benutzerauswahl mache ich eine $ http-Anfrage abzurufen Neue Daten aus der Datenbank. Für jede Tabelle habe ich verschiedene dtColumnDefs, die dynamisch gesetzt werden, da meine Spaltenüberschriften in der Tabelle dynamisch sind mit Ausnahme der ersten beiden und letzten Spalten. Meine Absicht ist es, die Sortierung für diese dynamischen Spaltenüberschriften zu deaktivieren Die Anzahl der dynamischen Spalten führt dann eine Schleife aus, um die Sortierung für diese Spalten dynamisch zu deaktivieren. Obwohl die Datentabelle für jede Benutzereingabe erfolgreich gerendert wird, werden die Sortieroptionen für erwartete Spalten nicht deaktiviert. Überprüfen Sie die plunker für Demo.Deaktivieren der Spaltensortierung funktioniert nicht für mehrere angularjs-Datatabellen

UPDATE

Dies ist eine Demo-Tabelle zu verstehen, wie es weitergehen, aber meine Original-Tabelle ist wenig komplex, wo ich einige Datenbankzeilen zeigte, als Spaltenüberschriften, und es gibt auch einige Filter wie einzigartig, i Ich benutze auch Index-Wert, um die Seriennummer zu zählen, so konnte ich davidkonrad 's Antwort nicht akzeptieren, da ich Spalten vom Controller nicht definieren möchte.

var app = angular.module('myApp', ['datatables']); 
 
app.controller('MyCtrl', function($scope, DTOptionsBuilder, DTColumnBuilder, DTColumnDefBuilder) { 
 

 
    $scope.department = [{ 
 
      value: "1", 
 
      name: "sales" 
 
     }, 
 
     { 
 
      value: "2", 
 
      name: "admin" 
 
     }, 
 
     { 
 
      value: "3", 
 
      name: "other" 
 
     } 
 
    ]; 
 

 
    $scope.dep = $scope.selected_dep; 
 
    $scope.i = 0; 
 
    $scope.depshow = function() { 
 
     $scope.i += 1; 
 
     var x = 'v' + $scope.i; 
 
     $scope.m = 'v' + $scope.i; 
 
     $scope.dep = $scope.selected_dep; 
 
     if ($scope.dep == 1) { 
 
      $scope.list = [{ 
 
        "eid": "10", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 

 
       { 
 
        "eid": "20", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 
       { 
 
        "eid": "30", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       } 
 
      ]; 
 
     } else if ($scope.dep == 2) { 
 
      $scope.list = [{ 
 
        "eid": "40", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 

 
       { 
 
        "eid": "50", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 
       { 
 
        "eid": "60", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       } 
 
      ]; 
 
     } 
 
     if ($scope.dep == 3) { 
 
      $scope.list = [{ 
 
        "eid": "70", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 

 
       { 
 
        "eid": "80", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       }, 
 
       { 
 
        "eid": "0", 
 
        "dyn1": "dval1", 
 
        "dyn2": "dval2", 
 
        "dyn3": "dval3", 
 
        "sales": "20" 
 
       } 
 
      ]; 
 
     } 
 

 
     $scope.x = {}; 
 

 
     $scope.x.dtOptions = DTOptionsBuilder.newOptions() 
 
      .withOption('order', [0, 'asc']); 
 

 
     $scope.ln = 4; 
 
     $scope.x.dtColumnDefs = []; 
 
     for (var i = 1; i < $scope.ln; i++) { 
 

 
      $scope.x.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef(i).notSortable()); 
 
     } 
 
    } 
 

 
});
<html> 
 
      <head> 
 
       <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 
 
       <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script> 
 
       <script src="http://phpflow.com/demo/angular_datatable_demo/angular-datatables.min.js"></script> 
 
       <script src="http://phpflow.com/demo/angular_datatable_demo/jquery.dataTables.min.js"></script> 
 
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> 
 
       <link rel="stylesheet" href="http://phpflow.com/demo/angular_datatable_demo/datatables.bootstrap.css"> 
 
      </head> 
 
      <div class="container"> 
 
      <div ng-app="myApp" ng-controller="MyCtrl"> 
 
    Select <select ng-model="selected_dep" ng-change="depshow()" ng-options="item.value as item.name for item in department"> 
 

 
    <option value="">select a department</option> 
 
    </select> 
 
     
 
      <table class="table table-striped table-bordered" datatable="ng" dt-options="m.dtOptions" dt-column-defs="m.dtColumnDefs" > 
 
       <thead> 
 
        <tr> 
 
      \t <th>sr</th> 
 

 
      \t <th>Employee ID</th> 
 
      \t <th>dynamic clm1</th> 
 
        <th>dynamic clm2</th> 
 
      \t <th>dynamic clm3</th> 
 
       <th>sales</th> 
 

 
      </thead> 
 
       <tbody> 
 
       
 
       <tr ng-repeat="data in list"> 
 
        <td> {{$index+1}} </td> 
 
             
 
        <td> {{ data.eid }} </td> 
 
        <td> {{ data.dyn1 }} </td> 
 
        <td> {{ data.dyn2 }} </td> 
 
        <td> {{ data.dyn3 }} </td> 
 
        
 
        <td> {{ data.sales }} </td> 
 
        </tr> 
 
      </tbody> 
 
      </table> 
 
      </div> 
 
</div>

+0

überprüfen Sie diese https://stackoverflow.com/questions/31027497/in-angular-js-how-to-disable-column-sort-feature-for-selected-columns –

+0

haben meine nutzlose Antwort gelöscht.Wie schon erwähnt [https://stackoverflow.com/questions/31521000/how-to-call-the-destroy-function-of-angular-datatables/34288205?noredirect=1#comment76564487_34288205) "Thread" denke ich Du bist auf der Strecke. Sie müssen die Bindungen entfernen, d. H. Zerstören Sie die DataTable, bevor Sie neu initialisieren. – davidkonrad

+0

@davidkonrad kann das immer noch nicht herausfinden. Überprüfen Sie http://plnr.co/edit/4Js7ZGQAbJMYQVX1NchN?p=preview – query

Antwort

0

Versuchen eckigen Klammern innerhalb des dtColumnDefs Drück wie

$scope.x.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef([i]).notSortable()); 
+0

löst es mein Problem? Überhaupt nicht !!! – query

1

OK. Ich weiß nicht, wo ich anfangen soll, aber Sie hatten eine breite Palette von Fehlern in Ihrem Code (nichts für ungut).

  • erklärt Nie x
  • eigentlich x nie wirklich verwendet
  • Nie dtColumnDefs

Und mehr ... Nach einigen Debuggen der Gesamtaufbau der Arbeit tat verwendet. Ihr größtes Problem war jedoch der Mix aus ng-repeat in Kombination mit der Datatable-Direktive, kombiniert mit der erneuten Deklaration der gleichen Eigenschaften. Es war einfach, den Code zu reparieren, aber es war nicht leicht, diese extreme Wettlaufsituation zu überwinden. Habe eine Stunde damit verbracht, es auszuarbeiten, aber es ist nicht möglich ohne viele $compile 's, $apply' s und $timeout 's.

Es muss wirklich nicht so kompliziert sein. Wie ich verstehe, hatten Sie zwei Probleme 1) notSortable hat nicht funktioniert 2) Sie könnten verschiedene Spalten (Eigenschaften) für verschiedene Listen haben. Einfach lassen Tables die Daten übertragen, und erklären dtColumns dynamisch eine neue Liste jedes Mal ausgewählt wird:

var columns = []; 
for (var prop in $scope.list[0]) { 
    columns.push({ data: prop }) 
} 
$scope.x.dtColumns = columns; 

Set $scope.list als Datenquelle:

$scope.x.dtOptions = DTOptionsBuilder.newOptions() 
    .withOption('data', $scope.list) 

den "Tables Weg" machen:

<table datatable="" ....></table> 

gespalten plnrk ->http://plnkr.co/edit/afqKW5uKW7Skfnm62zfq?p=preview

+0

nein, ich wollte die Sortierung nicht für alle Spalten deaktivieren, sondern nur für Spalte 1, 2 und 3 für alle Tabellen deaktivieren – query

+0

Welche Version von eckigen Datatables verwenden Sie? Ich habe das Gefühl, dass Sie eine ältere Version verwenden, gehen Sie für die neuesten 0.6.2. Es gibt [** kein Grund für Ihre NotSortable funktioniert nicht **] (http://plnkr.co/edit/x8uufPuTGrqxekeL5sL4?p=preview) ... Wenn es einen Fehler gibt, ist es nicht in Ihrem Code oben enthalten . – davidkonrad

+0

testete meinen Code mit Version 0.6.2 aber kein Fehler und kein Glück, ich denke, das Problem ist nicht version related.However, habe ich vergessen zu erwähnen, dass mein Code in der erwarteten Weise funktioniert, wenn ich eine einzelne Tabelle verwenden, wie Sie in der plunger aber wenn es mehrere Tabellen gibt, meine ich mehrere Aufrufe an die Funktion depshow() dann funktioniert das nicht mehr. – query

Verwandte Themen