2013-09-04 4 views
25

Ich wollte die Funktionalität haben, Zeilen in einer Tabelle neu anzuordnen (Zeilen mit Drag & Drop sortieren). Und der Index der Zeilenanordnung sollte sich auch im Modell ändern.Sortieren oder Neuanordnen von Zeilen einer Tabelle in angularjs (Drag & Drop)

Wie kann ich etwas Ähnliches tun: http://jsfiddle.net/tzYbU/1162/ unter Verwendung der Winkeldirektive?

Ich erzeuge Tabelle als:

<table id="sort" class="table table-striped table-bordered"> 
    <thead> 
    <tr> 
     <th class="header-color-green"></th> 
     <th ng-repeat="titles in Rules.Titles">{{titles.title}}</th> 
    </tr> 
    </thead> 
    <tbody ng-repeat="rule in Rules.data"> 
    <tr> 
     <td class="center"><span>{{rule.ruleSeq}}</span></td> 
     <td ng-repeat="data in rule.ruleData">{{statusArr[data.value]}}</td> 
    </tr> 
    </tbody> 
</table> 

Antwort

48

ich es geschafft habe, hier ist die Geige: Sortable Rows of Table

HTML

<div ng:controller="controller"> 
    <table style="width:auto;" class="table table-bordered"> 
     <thead> 
      <tr> 
       <th>Index</th> 
       <th>Count</th> 
      </tr> 
     </thead> 
     <tbody ui:sortable ng:model="list"> 
      <tr ng:repeat="item in list" class="item" style="cursor: move;"> 
       <td>{{$index}}</td> 
       <td>{{item}}</td> 
      </tr> 
     </tbody>{{list}} 
     <hr> 
</div> 

Richtlinie (JS)

var myapp = angular.module('myapp', ['ui']); 

myapp.controller('controller', function ($scope) { 
    $scope.list = ["one", "two", "thre", "four", "five", "six"]; 
}); 

angular.bootstrap(document, ['myapp']); 
+0

Setzen Sie das ng: -Modell auf die UI: Sortierbar scheint der Schlüssel zu sein, den Index im Modell synchron mit der DOM sortierten Reihenfolge zu halten. Vielen Dank! –

+11

Irgendeine Idee, wie man dies ohne jQuery mit reinem Angular.js handhabt? –

+0

Vielen Dank dafür. Einfach so toll, dass niemand es jemals erwähnt, es ist nicht nur die UL/LI-Struktur, mit der die Sortierung funktioniert! Ich habe gerade viele Stunden damit verbracht, meinen HTML-Code zu reparieren, um mit dem UL/LI-Layout statt mit Tabellen zu arbeiten, da es keine sehr guten jQuery-Plugin-Alternativen für das Ziehen mit der Spalte gibt. – Hachi

5

AngularJS nicht wirklich für die Manipulation von DOM-Elemente, sondern zu der HTML-Code einer Seite erstrecken gebaut wurde.

Siehe diesen question und this Wikipedia-Eintrag.

Für DOM Manipulation, jQuery/mootools/etc wird Ihnen gut passen (Hinweis: das Beispiel in Ihrem jsFiddle-Link).

Sie könnten AngularJS wahrscheinlich verwenden, um die Reihenfolge Ihrer Elemente zu verfolgen, um Ihr Modell zu aktualisieren. Ich bin mir nicht sicher, wie dies mit Richtlinien zu tun, aber der folgende Code kann nützlich sein

var MyController = function($scope, $http) { 
    $scope.rules = [...]; 
    ... 

} 

var updateRules = function(rule, position) { 
    //We need the scope 
    var scope = angular.element($(/*controller_element*/)).scope(); //controller_element would be the element with ng-controller='MyController' 

    //Update scope.rules 
} 

Dann, wenn Sie die Liste zu verschieben, einfach updateRules() mit der geändertenen Regel nennen und seine neuen Position im Modell.

+1

ja ich stimme zu, es muss von einem DOM-Manipulator wie jQuery getan werden, aber ich möchte, dass es die gleiche jQuery-Funktion hat, um innerhalb einer eckigen Anweisung zu sein. – Sushrut

+1

Leider ist mein Wissen über AngularJS _very_ minimal, jedoch [diese Seite] (http://henriquat.re/directives/advanced-directives-combining-angular-with-existing-components-and-jquery/angularAndJquery.html) hat einen Code, der AngularJS mit jQuery Datepicker kombiniert. Es gibt auch ein funktionierendes Beispiel. Ich bin mir sicher, dass es mit ein paar Modifikationen möglich wäre, stattdessen das jQuery Sortable Widget zu kombinieren. – johnnynotsolucky

+0

danke für die Mühe. :) – Sushrut

2

Wenn ich Sie richtig verstehe, Sie wollen in der Lage sein die Reihen sortieren? Wenn ja, verwenden UI-Sortable: GitHub Demo: codepen.io/thgreasi/pen/jlkhr

+1

Funktioniert UI-Sortable mit Tabellenzeilen? Oder nur Listenelemente? – HelloWorld

+0

Ich habe mit Tabellenzeilen verwendet. Es funktioniert gut. Du kannst es benutzen. – ionat

11

Es gibt eine andere Bibliothek: RubaXa/Sortable: https://github.com/RubaXa/Sortable

Es ist für moderne Browser und ohne jQuery Abhängigkeit. Enthalten ist eine Winkelanweisung. Ich werde es jetzt überprüfen.

Sie erhalten zusätzlich eine gute Touch-Unterstützung.

+1

Es sieht nicht so aus, als ob dies Tabellen unterstützt. – tavnab

+3

Scheint für mich zu arbeiten. Stellen Sie sicher, dass Sie die Anweisung auf das TBODY-Element setzen: http://jsbin.com/gebirenoje/1/edit?html,js,output –

+0

Sieht wie eine solide Lösung ohne jQuery-Abhängigkeit aus. Schauen Sie sich ihre Website an, sie haben auch viele Beispiele dort: https://rubaxa.github.io/Sortable/ – user1438038

3

Jeder, der so etwas will, aber die akzeptierte Antwort nicht versteht. Hier ist eine Direktive UI.Sortable für AngularJS, mit der Sie ein Array/Tabellenzeilen mit Drag & Tropfen sortieren können.

Anforderungen

JQuery v3.1+ (for jQuery v1.x & v2.x use v0.14.x versions) 
JQueryUI v1.12+ 
AngularJS v1.2+ 

Nutzungs

Legen Sie die Skriptdatei: sortable.js in Ihrer Anwendung: (Sie können diese sortable.js von here

<script type="text/javascript" src="modules/directives/sortable/src/sortable.js"></script> 
finden

stellen Sie sicher, JQuery aufgenommen haben, AngularJS und jQueryUI js Dateien in Reihenfolge vor diesem sortierbar Datei das sortierbare Modul als Abhängigkeit Anwendungsmodul hinzufügen:

var myAppModule = angular.module('MyApp', ['ui.sortable']) 

die Richtlinie auf Ihre Formularelemente Nehmen :

<ul ui-sortable ng-model="items"> 
    <li ng-repeat="item in items">{{ item }}</li> 
</ul> 

Entwicklung Anmerkungen:

  1. Das ng-Modell ist erforderlich, damit die Richtlinie weiß, welches Modell aktualisiert werden soll.
  2. ui-sortierbaren Element sollte nur ein ng-repeat
  3. Filter enthalten, die das Modell (wie Filter, orderBy, LimitTo, ...) manipulieren sollte in der Steuerung anstelle der angewendet werden ng-repeat

3. Punkt ist sehr wichtig, da es dauerte fast eine Stunde zu verstehen, , warum meine Sortierung nicht funktioniert ?? Es war wegen OrderBy in html und das war die Sortierung wieder zurückgesetzt.

Für mehr Verständnis können Sie das Detail überprüfen here.

+1

liebe die Antwort genial –