0

使用嵌套的 JQuery 可排序对象时,如何使 DOM 和模型保持同步?假设我有一个控制器,其定义如下:

function testCtrl($scope) {
    $scope.data = [{'name' : 'Test 1',
                   'index' : 0,
                   'values': [{'name' : 'sub test 1-1', 'index' : 0}, {'name' : 'sub test 1-2', 'index' : 1}]},
                   {'name' : 'Test 2',
                   'index' : 1,
                   'values': [{'name' : 'sub test 2-1', 'index' : 0}, {'name' : 'sub test 2-2', 'index' : 1}]}
   ];

   $scope.orderProp = 'index';
}

现在我想使用以下模板在 JQuery sortables 中显示第一级数据和第二级数据:

<ul ng-sortable='data'>
    <li ng-repeat="d in data | orderBy:orderProp">
        <p>{{d.name}}</p>
        <ul ng-Sub-Sortable="d.values">
            <li ng-repeat="sub in d.values">{{sub.eg}}</li> 
        </ul>
    </li>
</ul>

我使用指令来指定两种不同类型的可排序列表,因为它们的行为确实不同(为简洁起见,从下面删除):

app.directive("ngSortable", function(){
    return {
        link: function(scope, element, attrs){                  
            element.sortable();
        }
    };
}

app.directive("ngSubSortable", function(){
    return {
        link: function(scope, element, attrs){                  
            element.sortable();
        }
    };
}

现在,当用户对列表进行排序时,我如何更新模型以确保索引正确,从而将来正确输出列表?

4

2 回答 2

1

最好用 ngModel 和 dom 同步数据

你可以试试这个: https ://github.com/JimLiu/Angular-NestedSortable

于 2013-11-03T03:33:06.727 回答
0

对于嵌套排序中具有位置相关数据的项目,我发现保持模型与 DOM 同步的最佳方法是将当前位置作为属性添加到每个元素,如下所示:

<ul ng-sortable='data'>
    <li ng-sortable-index="{{$index}}" ng-repeat="d in data | orderBy:orderProp">
        <p>{{d.name}}</p>
        <ul ng-Sub-Sortable="d.values">
            <li ng-sortable-index="{{$index}}" ng-repeat="sub in d.values">{{sub.eg}}</li> 
        </ul>
    </li>

然后在初始化 jQuery 可排序的指令中,可排序更新方法应指定如下:

element.sortable({
    update: function(event, ui) {
        var model = scope.$eval(attrs.ngSubSortable);

        // loop through items in new order
        element.children().each(function(index) {
            // get old item index
            var oldIndex = parseInt($(this).attr("ng-sortable-index"), 10);
            model[oldIndex].index = index;
         });

         scope.$apply();
     }
});
于 2012-08-21T21:59:57.677 回答