0

Я использую угловые ui для сортировки, чтобы перетаскивать элементы между списками. То, что я хотел бы сделать, это (при определенных условиях перетаскивания) иметь диалоговое окно подтверждения, и если пользователь отменяет диалог, верните списки обратно в исходное состояние. Я могу использовать метод ui.item.sortable.cancel() внутри события обновления, но если я использую модальный, который возвращает обещание, я не могу понять, как вернуть списки при отмене. Вот что у меня в контроллере (modalService является самозагрузки $ uibModal):Как подождать подтверждения диалога внутри углового ui сортируемого обратного вызова

$scope.sortableOptions = 
     handle: ' > span > span > .task-drag-icon', 
     connectWith: ".task-subset" 
     placeholder: "sortable-placeholder", 
     forcePlaceholderSize: true, 
     update: (e, ui) -> 
      if ui.item.sortable.sourceModel == ui.item.sortable.droptargetModel #sort was within the same list 
      #some other logic here..... 
      else 
      droptarget_element = ui.item.sortable.droptarget 

      if droptarget_element.attr('ng-model') == "task.subTasks" 
       #need the user to confirm here if they really want to do this drag/drop 
       modalOptions = 
       closeButtonText: 'Cancel' 
       actionButtonText: 'Make SubTask' 
       headerText: 'Make SubTask?' 
       bodyText: 'This action will remove any existing task groups as it will become a child task. Is this OK?' 
       modalService.showModal({}, modalOptions).then (result) -> 
        console.log "accpted" 
       ,() -> 
        console.log "cancelled" 
        #need to call ui.item.sortable.cancel() here, but I cant because the update callback has finished already!!!! 

       console.log "finished - gets to here immediately as modalService is asyncronous" 

      return 

Любые советы оценили.

ответ

0

Я не мог получить эту работу без каких-либо крупных хаков, поэтому вместо этого я не использовал метод cancel() в обратном вызове обновления, а просто возвращал данные в соответствующие массивы обратно, как они были на этой остановке обратный вызов, путем присвоения некоторых переменных:

$scope.sortableOptions = 
     handle: ' > span > span > .task-drag-icon', 
     connectWith: ".task-subset" 
     placeholder: "sortable-placeholder", 
     forcePlaceholderSize: true, 
     stop: (e, ui) -> 
      orig_index = ui.item.sortable.index 
      new_idex = ui.item.sortable.dropindex 
      sourceModel = ui.item.sortable.sourceModel 
      droptargetModel = ui.item.sortable.droptargetModel 
      model = ui.item.sortable.model 

      if sourceModel == droptargetModel #sort was within the same list 
      #some other logic here..... 
      else 
      droptarget_element = ui.item.sortable.droptarget 

      if droptarget_element.attr('ng-model') == "task.subTasks" 
       #need the user to confirm here if they really want to do this drag/drop 
       modalOptions = 
       closeButtonText: 'Cancel' 
       actionButtonText: 'Make SubTask' 
       headerText: 'Make SubTask?' 
       bodyText: 'This action will remove any existing task groups as it will become a child task. Is this OK?' 
       modalService.showModal({}, modalOptions).then (result) -> 
        console.log "accpted" 
       ,() -> 
        #put model back in orginal poisition 
        sourceModel.splice orig_index, 0, model 
        #remove from target array 
        droptargetModel.splice new_idex, 1 

      return