2014-01-06 3 views
2

Когда я перетаскиваю элемент, который я нарисовал на холсте, мне также хотелось бы, чтобы его живые x и y координаты отображались за пределами холста.Обновление угловой модели от события перетаскивания мыши

Беглый описание ..

Вид:

//some HTML, including a canvas 
{{xCoord}} </br> 
{{yCoord}} 

Директива: (onDrag() вызывается всякий раз, когда пользователь нажимает на и перетаскивает объект)

someCanvasObject.onDrag() { 
    $scope.xCoord = canvasObject.x; 
    $scope.yCoord = canvasObject.y; 
    $scope.$digest(); 
} 

Однако, когда я использую $scope.$digest(), чтобы изменить выведенные координаты, я получаю «$ apply уже выполняется» ошибка becau se $digest() быстро вызывается перетаскиванием, быстро изменяя координаты.

Есть ли альтернативный способ использования $digest(), который не будет конфликтовать при быстром использовании описанным выше способом?

(мне сказали, $$phase плохая практика.)

+1

Можете ли вы сделать демо? – m59

+0

Вот пример, где вы можете спамить $ digest или $ apply без проблем. http://jsbin.com/IbAfesur/22/edit. Вы действительно должны включить демо-версию, чтобы ваша проблема была более ясной. Я не вижу, в чем проблема. – m59

+0

Спасибо :) И извинения, я обновил вопрос, так что это немного более подробно. Пожалуйста, дайте мне знать, если нужно больше! –

ответ

0

Вы могли бы начать пробовать что-то вроде этого:

var timeout; 
someCanvasObject.onDrag() { 
    $scope.xCoord = canvasObject.x; 
    $scope.yCoord = canvasObject.y; 
    if (timeout) $timeout.cancel(timeout); 
    timeout = $timeout(function() { 
     $scope.$digest(); 
    }); 
} 

Идея заключается в том, что каждый раз, когда запускается событие перетаскивания, вы вызываете дайджест, но если onDrag вызывается 10 раз в течение одного дайджеста, в очередь ставится только один следующий дайджест.

У кого-то, вероятно, будет лучший способ добиться этого, но это может заставить вас начать.

Смежные вопросы