This directive allows you to jQueryUI Sortable.
npm install angular-ui-sortableThis directive allows you to sort an array with drag & drop.
- JQuery v3.1+ (for jQuery v1.x & v2.x use v0.14.x versions)
- JQueryUI v1.12+
- AngularJS v1.2+
Single minified cdn link ~245kB and example with JQuery v1.x, required parts of JQueryUI v1.10, AngularJS v1.2 & latest angular-ui-sortable.
Notes:
> * JQuery must be included before AngularJS.
> * JQueryUI dependecies include widget, data, scroll-parent, mouse & sortable. Creating a custom build will greatly reduce the required file size. (CDN links for comparison: full vs minimal)
> * Users of AngularJS pre v1.2 can use v0.10.x or v0.12.x branches.
> * Early adopters of Angular2 can use the ng2 branch.
* Install with Bower bower install -S angular-ui-sortable
* Install with npm npm install -S angular-ui-sortable
* Download one of the Releases or the latest Master branch
Load the script file: sortable.js in your application:
``html`
Add the sortable module as a dependency to your application module:
`js`
var myAppModule = angular.module('MyApp', ['ui.sortable'])
Apply the directive to your form elements:
`html`
Developing Notes:
* ng-model is required, so that the directive knows which model to update.ui-sortable
* element should contain only one ng-repeat, but other non-repeater elements above or below may still exist.ng-model
Otherwise the index matching of the 's items and the DOM elements generated by the ng-repeat will break. ng-model
In other words: The items of must match the indexes of the DOM elements generated by the ng-repeat.Filters
* that manipulate the model (like filter, orderBy, limitTo,...) should be applied in the controller instead of the ng-repeat (refer to the provided examples). ng-model
This is the preferred way since it:
- is performance wise better
- reduces the chance of code duplication
- is suggested by the angularJS team
- it does not break the matching of the generated DOM elements and the 's itemsui-sortable
* lists containing many 'types' of items can be implemented by using dynamic template loading with ng-include or a loader directive, to determine how each model item should be rendered. Also take a look at the Tree with dynamic template example.
All the jQueryUI Sortable options can be passed through the directive.
Additionally, the ui argument of the available callbacks gets enriched with some extra properties as specified to the API.md file.start
Any model changes that happen inside the available callbacks, are applied right after the stop event. We are not wrapping callbacks like /change/... with $apply, in order to minimize the number of digest loops and avoid possible modifications of the model (eg: by watchers) before the drop takes place.
`js
myAppModule.controller('MyController', function($scope) {
$scope.items = ["One", "Two", "Three"];
$scope.sortableOptions = {
update: function(e, ui) { ... },
axis: 'x'
};
});
`
`html`
When using event callbacks (start/update/stop...), avoid manipulating DOM elements (especially the one with the ng-repeat attached).
The suggested pattern is to use callbacks for emmiting events and altering the scope (inside the 'Angular world').
#### ui-floating
ui-floating (default: undefined)
Description: Enables a workaround for smooth horizontal sorting.
Type: Boolean/String/undefinedstart
* undefined: Relies on jquery.ui to detect the list's orientation.
* false: Forces jquery.ui.sortable to detect the list as vertical.
* true: Forces jquery.ui.sortable to detect the list as horizontal.
* "auto": Detects on each drag if the element is floating or not.
To have a smooth horizontal-list reordering, jquery.ui.sortable needs to detect the orientation of the list.
This detection takes place during the initialization of the plugin (and some of the checks include: whether the first item is floating left/right or if 'axis' parameter is 'x', etc).
There is also a known issue about initially empty horizontal lists.
To provide a solution/workaround (till jquery.ui.sortable.refresh() also tests the orientation or a more appropriate method is provided), ui-sortable directive provides a ui-floating option as an extra to the jquery.ui.sortable options.
`html`
OR
`js`
$scope.sortableOptions = {
'ui-floating': true
};`html`
#### ui-model-items
ui-model-items (default: > [ng-repeat],> [data-ng-repeat],> [x-ng-repeat])
Description: Defines which elements should be considered as part of your model.
Type: CSS selector/String
This is the model related counterpart option of jQuery's items option.
#### ui-preserve-size
ui-preserve-size (default: undefined)
Description: Set's the size of the sorting helper to the size of the original element before the sorting.
Type: Boolean/undefined
This is useful for elements that their size is dependent to other page characteristics.
A representative example of such cases are
s.`html``js``html`update callback, you can check the item that is dragged and cancel the sorting.`js`update is the appropriate place to cancel a sorting, since it occurs before any model/scope changes but after the DOM position has been updated.ui.item.scope and the directive's ng-model, are equal to the scope before the drag start.cancel should be called inside the update callback of the originating list. A simple way to is to use the ui.item.sortable.received property:`js`````items to target your ng-repeated elements. Following best practices, it is also highly recommended that you add a track by expression to your ng-repeat. Angular Material example.`js``html``sh`test\karma.conf.js.`sh`grunt connect:server : giving you a development server at http://127.0.0.1:8000/.grunt karma:server : giving you a Karma server to run tests (at http://localhost:9876/ by default). You can force a test on this server with grunt karma:unit:run.grunt watch : will automatically test your code and build your demo. You can demo generation with grunt build:gh-pages`. |