我正在尝试为 ng-repeat'ed 指令处理 touchmove 事件,无论 touchstart 发生在哪里。在我目前的代码中,如果其中一个元素检测到 touchstart,则所有 touchmove 事件都将由同一个元素处理,而不管触摸移动发生在屏幕上的哪个位置。当我使用 mousemove 执行类似的功能时,每个元素只有在鼠标悬停在相应元素上时才能正确接收 mousemove 事件。
我已经看到与 AngularJS 无关的关于检测 touchmove 事件的 DOM 元素的问题(如何找出 touchmove javascript 事件的实际 event.target?),但如果我这样做,我看不到处理方法在具有正确范围的指令/控制器内。
这是一个基本示例(为方便起见:http: //jsfiddle.net/zMKKv/1/)来比较 mousemove 和 touchmove 之间的行为差异:
<html lang="en" ng-app="myApp">
<head>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
</head>
<body>
<div ng-controller="countController">
<counter ng-repeat="item in somedata" />
</div>
</body>
</html>
//-----------
.box {
width: 150px;
height: 150px;
border: solid;
float: left;
}
//-----------
var app = angular.module('myApp', []);
app.controller("countController", function ($scope) {
$scope.somedata = [{
label: "One",
count: 0
}, {
label: "Two",
count: 0
}, {
label: "Three",
count: 0
}];
$scope.increment = function(item) {
item.count = item.count + 1;
$scope.$digest();
};
});
app.directive("counter", function () {
return {
restrict: "E",
template: '<div class="box">{{item.label}}<p>{{item.count}}</div>',
link: function (scope, element, attrs) {
element.on('mousemove', function () {
scope.increment(scope.item);
});
element.on('touchmove', function (e) {
e.preventDefault();
scope.increment(scope.item);
});
}
};
});