拖放可排序的ng:在AngularJS中重复?

Nic*_*ack 61 javascript jquery-ui-sortable angularjs

在AngularJS中的元素jQuery.sortable上是否易于使用ng-repeat


如果重新排序自动传播的项目,这将排序回源数组,这将是非常棒的.我担心这两个系统会打架.有一个更好的方法吗?

Gui*_*e86 77

Angular UI有一个可排序的指令,Click Here for Demo

代码位于ui-sortable,用法:

<ul ui-sortable ng-model="items">
  <li ng-repeat="item in items">{{ item }}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • jsfiddle示例似乎无法可靠地工作.没有错误,但订单间歇性地变得不同步.尝试使用firefox和chrome (17认同)
  • 知道如何在没有jQuery的情况下实现这一点吗? (12认同)
  • @Kugel你甚至尝试过最新版本的angular-ui可排序?按照角度演变,演示很快就会过时:https://github.com/angular-ui/ui-sortable (3认同)
  • 请注意,您应该使用`ui:sortable`添加`ng-model`:`<ul ui:sortable ng:model ="list">` (2认同)

Man*_*ker 12

我尝试做同样的事情并提出以下解决方案:

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);
                }
            }
        });
    };
});
Run Code Online (Sandbox Code Playgroud)

像这样使用:

<ol id="todoList" my:sortable="todos" my:onsort="onSort()">
Run Code Online (Sandbox Code Playgroud)

它似乎运作得相当好.诀窍是在更新模型之前撤消sortable所做的DOM操作,否则agular会从DOM中失去同步.

更改通知通过my:onsort表达式工作,该表达式可以调用控制器方法.

我基于角度todo教程创建了一个JsFiddle来展示它是如何工作的:http://jsfiddle.net/M8YnR/180/


res*_*ode 10

这是我用角度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();
            }
        });
    };
});
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我没有jquery.ui的可排序Angular.js指令的实现: