重新排列angularfire支持列表的项目,拖放样式

时间:2013-12-31 14:51:42

标签: jquery-ui angularjs drag-and-drop firebase angularfire

我正在构建一个angularjs / firebase应用程序,没有使用angularfire绑定(v0.5.0)。

我有一个项目列表,显示在ng-repeat<tr>的表格中,如下所示:

<table>                               
    <tbody>                                                                
        <tr ng-repeat="(index, item) in items">
            <td>
                <input type="checkbox" ng-model="item.done">
            </td>              
            <td>                                                 
                <input type="text" ng-model="item.text" ng-focus="onItemFocus(index)" ng-blur="onItemBlur(index)">
            </td>                                                              
            <td>                                                               
                <button type="button" ng-click="remove(index)">&times;</button>
            </td>                                                              
        </tr>                                                                  
    </tbody>                                                               
</table>                                                                   

并且在这个项目列表上有一个angularfire 3路数据绑定,如:

$scope.ref = new Firebase('...');
$scope.remote = $firebase($scope.ref);
$scope.remote.$child("items").$bind($scope, "items"); 

这一切都很好,但现在我试图添加通过拖放重新排序项目的可能性。

我设法用jquery-ui设置拖放UI(本质上是调用$("tbody").sortable()),但我的问题是将它绑定到角度模型。关于那个问题number of questionsgreat jsfiddles),但在我的情况下,angularfire 3路绑定似乎搞乱了。

我认为我需要使用firebase priorities与angularfire orderByPriority一起使用,并且可能会在其中一个sortable callbacks处理它,但我很难弄清楚我应该怎么做......并且找不到任何关于它的文档。

有没有人做过类似的事情,你能否就如何设置这个问题分享一些指示?

1 个答案:

答案 0 :(得分:2)

我很久以前看到你的帖子,而我正在寻找相同的解决方案。这是我放在一起的东西:

function onDropComplete(dropIndex, item) {
if (!item.isNew){
  var dragIndex = $scope.fireData.indexOf(item);
  item.priority = dropIndex;
  $scope.fireData.$save(dragIndex);
  if (dragIndex > dropIndex){
    while ($scope.fireData[dropIndex] && dropIndex !== dragIndex ){
      $scope.fireData[dropIndex].priority = dropIndex+1;
      $scope.fireData.$save(dropIndex);
      dropIndex++;
    }
  } else if(dragIndex < dropIndex){
    while ($scope.fireData[dropIndex] && dropIndex !== dragIndex ){
      $scope.fireData[dropIndex].priority = dropIndex-1;
      $scope.fireData.$save(dropIndex);
      dropIndex--;
    }
  }
} else if (item.isNew){
  item = angular.copy(item);
  item.isNew = false;
  item.priority = dropIndex;
  $scope.fireData.$add(item);
  while ($scope.fireData[dropIndex]){
    $scope.fireData[dropIndex].priority = dropIndex+1;
    $scope.fireData.$save(dropIndex);
    dropIndex++;
  }
}

}

在这里,我会获取列表中已有的项目,并根据拖放的项目在放置区域的上方或下方调整项目的优先级属性。此外,如果列表中的新项目中的拖动项目将被添加到已删除的索引处,并且下面的所有项目将被提升1个优先级。这取决于您的列表是否按var sync = $firebase(ref.orderByChild('priority'));排序,并且您要使用ngDraggable。 以下是一些HTML示例:

<tr ng-repeat="obj in fireData" ng-drop="true" ng-drop-success="onDropComplete($index, $data,$event)">
    <td draggable="true" ng-drag="true" ng-drag-data="obj">
      <span class="glyphicon glyphicon-move"></span><div class="drag-name">{{obj.name}}</div>
    </td>
    <td>{{obj.name}}</td>
    <td>{{obj.type}}</td>
    <td><input type="checkbox" ng-change="saveChanges(obj)" ng-model="obj.completed"></td>
    <td>
      <div class="" ng-click="deleteItemFromList(obj)">
        <span class="glyphicon glyphicon-remove"></span>
      </div>
    </td>
  </tr>