Javascript 迁移到AngularJS 1.2会破坏可排序包装器指令
我有一个sortable wrapper指令,允许在列表中移动一个项目,并从一个列表移动到另一个列表 对于数组容器: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> <
$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>