Подтвердить что ты не робот

Angular JS (angular -ui-tree) ng-click конфликт против события начала перетаскивания

В настоящее время я использую angular-ui-tree, и я пытаюсь добиться следующего поведения:

Когда пользователь просто нажимает "draggable node", он запускает функцию ng-click, если пользователь нажимает и начинает перетаскивать ng-click, игнорируется и запускается регулярное перетаскивание n-drop.

У меня есть следующая структура html:

<div ui-tree="rootTree" ng-controller="Controller">
    <div ui-tree-nodes="" ng-model="nodes">
        <div ng-repeat="node in nodes" ui-tree-node="" ng-click="selectNode(node)" >
            <div ui-tree-handle="">
            ...
            </div>
        </div>
    </div>
</div>

Текущее поведение заключается в том, что drag-n-drop начинается сразу же на "mousedown", и нет способа отличить 'click' от попытки начать перетаскивание

Вот код библиотеки, который запускает drag-n-drop из node uiTreeNode.js

var bindDrag = function() {
   element.bind('touchstart mousedown', function (e) {
   if (!scope.$treeScope.multiSelect) {
      dragDelaying = true;
      dragStarted = false;
      dragTimer = $timeout(function() {
         dragStartEvent(e);
         dragDelaying = false;
      },    scope.$treeScope.dragDelay);
   } else {
      toggleSelect(e);
   }
   });
   element.bind('touchend touchcancel mouseup', function() {
      $timeout.cancel(dragTimer);
   });
};
4b9b3361

Ответ 1

У меня была одна и та же проблема, и я решил ее, увеличив задержку перетаскивания данных до 100, Try:

ui-tree="rootTree" ng-controller="Controller" data-drag-delay="100"

Ответ 2

Это довольно старый вопрос, но если вы не хотите иметь задержку, вы можете зарегистрировать обратный вызов dropped() и выполнить действие click, если индекс не изменился. Например:

dropped: function(event){
    //if element was not moved, use click event
    if(event.source.index == event.dest.index){
        $scope.someAction();
    }
}