Ответ 1
У меня была одна и та же проблема, и я решил ее, увеличив задержку перетаскивания данных до 100, Try:
ui-tree="rootTree" ng-controller="Controller" data-drag-delay="100"
В настоящее время я использую 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);
});
};
У меня была одна и та же проблема, и я решил ее, увеличив задержку перетаскивания данных до 100, Try:
ui-tree="rootTree" ng-controller="Controller" data-drag-delay="100"
Это довольно старый вопрос, но если вы не хотите иметь задержку, вы можете зарегистрировать обратный вызов dropped()
и выполнить действие click, если индекс не изменился. Например:
dropped: function(event){
//if element was not moved, use click event
if(event.source.index == event.dest.index){
$scope.someAction();
}
}