Перетаскивание сортируемого ng: повторяется в AngularJS?
Это вообще простой в использовании jQuery.sortable
on ng-repeat
элементы в AngularJS?
было бы здорово, если бы переупорядочение элементов автоматически распространяло этот порядок обратно в исходный массив. Я боюсь двух систем боя. Есть ли лучший способ сделать это?
5 ответов:
угловой пользовательского интерфейса действует директива сортировки, Нажмите здесь для демонстрации
код, расположенный в ui-сортируемый использование:
<ul ui-sortable ng-model="items"> <li ng-repeat="item in items">{{ item }}</li> </ul>
Я попытался сделать то же самое и придумал следующее решение:
angular.directive("my:sortable", function(expression, compiledElement){ return function(linkElement){ var scope = this; linkElement.sortable( { placeholder: "ui-state-highlight", opacity: 0.8, update: function(event, ui) { var model = scope.$tryEval(expression); var newModel = []; var items = []; linkElement.children().each(function() { var item = $(this); // get old item index var oldIndex = item.attr("ng:repeat-index"); if(oldIndex) { // new model in new order newModel.push(model[oldIndex]); // items in original order items[oldIndex] = item; // and remove item.detach(); } }); // restore original dom order, so angular does not get confused linkElement.append.apply(linkElement,items); // clear old list model.length = 0; // add elements in new order model.push.apply(model, newModel); // presto scope.$eval(); // Notify event handler var onSortExpression = linkElement.attr("my:onsort"); if(onSortExpression) { scope.$tryEval(onSortExpression, linkElement); } } }); }; });
использовать так:
<ol id="todoList" my:sortable="todos" my:onsort="onSort()">
это, кажется, работает довольно хорошо. Трюк состоит в том, чтобы отменить манипуляцию DOM, сделанную sortable перед обновлением модели, иначе agular будет десинхронизирован из DOM.
уведомление об изменениях работает через выражение my:onsort, которое может вызывать методы контроллера.
Я создал JsFiddle на основе углового todo учебник показывает, как это работает: http://jsfiddle.net/M8YnR/180/
вот как я делаю это с угловой v0.10.6. Вот это jsfiddle
angular.directive("my:sortable", function(expression, compiledElement){ // add my:sortable-index to children so we know the index in the model compiledElement.children().attr("my:sortable-index","{{$index}}"); return function(linkElement){ var scope = this; linkElement.sortable({ placeholder: "placeholder", opacity: 0.8, axis: "y", update: function(event, ui) { // get model var model = scope.$apply(expression); // remember its length var modelLength = model.length; // rember html nodes var items = []; // loop through items in new order linkElement.children().each(function(index) { var item = $(this); // get old item index var oldIndex = parseInt(item.attr("my:sortable-index"), 10); // add item to the end of model model.push(model[oldIndex]); if(item.attr("my:sortable-index")) { // items in original order to restore dom items[oldIndex] = item; // and remove item from dom item.detach(); } }); model.splice(0, modelLength); // restore original dom order, so angular does not get confused linkElement.append.apply(linkElement,items); // notify angular of the change scope.$digest(); } }); }; });
вы можете перейти на директиву ng-sortable, которая является легкой и не использует jquery. вот ссылка ng-сортируемые элементы перетаскивания