Javascript 迁移到AngularJS 1.2会破坏可排序包装器指令

Javascript 迁移到AngularJS 1.2会破坏可排序包装器指令,javascript,jquery-ui,angularjs,jquery-ui-sortable,Javascript,Jquery Ui,Angularjs,Jquery Ui Sortable,我有一个sortable wrapper指令,允许在列表中移动一个项目,并从一个列表移动到另一个列表 对于数组容器: $scope.container = [ [{id: '1.1'}, {id: '1.2'}, {id: '1.3'}], [{id: '2.1'}, {id: '2.2'}, {id: '2.3'}] ] 我使用的指令如下: <div ng-repeat="array in container"> <ul sortable> <

我有一个sortable wrapper指令,允许在列表中移动一个项目,并从一个列表移动到另一个列表

对于数组容器:

$scope.container = [
  [{id: '1.1'}, {id: '1.2'}, {id: '1.3'}],
  [{id: '2.1'}, {id: '2.2'}, {id: '2.3'}]
]
我使用的指令如下:

<div ng-repeat="array in container">
  <ul sortable>
    <li ng-repeat="item in array">{{ item.id }}</li>
  </ul> 
</div>
在版本1.2.0-rc.2之前,该指令一直运行良好,因为1.2.0-rc.3在移动项目时,我会遇到以下错误:

TypeError: Cannot call method 'insertBefore' of null
    at http://code.angularjs.org/1.2.1/angular.js:3857:22
    at forEach (http://code.angularjs.org/1.2.1/angular.js:303:18)
    at Object.enter (http://code.angularjs.org/1.2.1/angular.js:3856:9)
    at http://code.angularjs.org/1.2.1/angular.js:18828:26
    at publicLinkFn (http://code.angularjs.org/1.2.1/angular.js:5443:29)
    at boundTranscludeFn (http://code.angularjs.org/1.2.1/angular.js:5555:21)
    at controllersBoundTransclude (http://code.angularjs.org/1.2.1/angular.js:6145:18)
    at ngRepeatAction (http://code.angularjs.org/1.2.1/angular.js:18826:15)
    at Object.$watchCollectionAction [as fn] (http://code.angularjs.org/1.2.1/angular.js:11347:11)
    at Scope.$digest (http://code.angularjs.org/1.2.1/angular.js:11443:27) 
下面是一个复制错误的plunker:

有什么想法吗?

用这个:

<li ng-repeat="item in array track by item.id">{{ item.id }}</li>
  • {{item.id}
  • 为什么?


    我认为您正在重新创建项目(
    getNewItemFromBackend(item)
    ),一旦它们的位置发生变化。因为
    ngRepeat
    通过对象相等性跟踪它们,所以一旦对象离开列表,Angular就无法找到它来插入DOM元素。我对这个解释不是100%满意,但大致上是这样的。

    最后,我将实现更改为使用angular ui可排序模块。考虑到ng repeat指令1.2版本的变化。请参阅。

    使用此解决方案,在列表中移动项目时,它不再中断,但在列表之间移动项目时仍然中断:这是因为jQueryUI和Angular ngRepeat都在更改DOM,而没有协调。我不知道如何补救这一点。
    <li ng-repeat="item in array track by item.id">{{ item.id }}</li>