angularjs-rails 1.2.14 → 1.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +4 -5
- data/vendor/assets/javascripts/angular-cookies.js +8 -9
- data/vendor/assets/javascripts/angular-loader.js +6 -8
- data/vendor/assets/javascripts/angular-mocks.js +10 -11
- data/vendor/assets/javascripts/angular-resource.js +13 -3
- data/vendor/assets/javascripts/angular-route.js +139 -134
- data/vendor/assets/javascripts/angular-sanitize.js +2 -2
- data/vendor/assets/javascripts/angular-scenario.js +190 -81
- data/vendor/assets/javascripts/angular-touch.js +16 -2
- data/vendor/assets/javascripts/angular.js +196 -81
- data/vendor/assets/javascripts/unstable/angular-animate.js +1613 -0
- data/vendor/assets/javascripts/unstable/angular-cookies.js +40 -29
- data/vendor/assets/javascripts/unstable/angular-loader.js +166 -58
- data/vendor/assets/javascripts/unstable/angular-mocks.js +832 -535
- data/vendor/assets/javascripts/unstable/angular-resource.js +266 -196
- data/vendor/assets/javascripts/unstable/angular-route.js +927 -0
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +246 -180
- data/vendor/assets/javascripts/unstable/angular-scenario.js +19167 -13895
- data/vendor/assets/javascripts/unstable/{angular-mobile.js → angular-touch.js} +241 -126
- data/vendor/assets/javascripts/unstable/angular.js +12891 -8032
- metadata +5 -3
@@ -1,25 +1,172 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.
|
3
|
-
* (c) 2010-
|
2
|
+
* @license AngularJS v1.3.0-beta.3
|
3
|
+
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular, undefined) {
|
7
|
-
'use strict';
|
6
|
+
(function(window, angular, undefined) {'use strict';
|
8
7
|
|
9
8
|
/**
|
10
|
-
* @ngdoc
|
11
|
-
* @name
|
9
|
+
* @ngdoc module
|
10
|
+
* @name ngTouch
|
12
11
|
* @description
|
13
|
-
*
|
14
|
-
*
|
12
|
+
*
|
13
|
+
* # ngTouch
|
14
|
+
*
|
15
|
+
* The `ngTouch` module provides touch events and other helpers for touch-enabled devices.
|
16
|
+
* The implementation is based on jQuery Mobile touch event handling
|
17
|
+
* ([jquerymobile.com](http://jquerymobile.com/)).
|
18
|
+
*
|
19
|
+
*
|
20
|
+
* See {@link ngTouch.$swipe `$swipe`} for usage.
|
21
|
+
*
|
22
|
+
* <div doc-module-components="ngTouch"></div>
|
23
|
+
*
|
15
24
|
*/
|
16
25
|
|
17
|
-
// define
|
18
|
-
|
26
|
+
// define ngTouch module
|
27
|
+
/* global -ngTouch */
|
28
|
+
var ngTouch = angular.module('ngTouch', []);
|
29
|
+
|
30
|
+
/* global ngTouch: false */
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @ngdoc service
|
34
|
+
* @name $swipe
|
35
|
+
*
|
36
|
+
* @description
|
37
|
+
* The `$swipe` service is a service that abstracts the messier details of hold-and-drag swipe
|
38
|
+
* behavior, to make implementing swipe-related directives more convenient.
|
39
|
+
*
|
40
|
+
* Requires the {@link ngTouch `ngTouch`} module to be installed.
|
41
|
+
*
|
42
|
+
* `$swipe` is used by the `ngSwipeLeft` and `ngSwipeRight` directives in `ngTouch`, and by
|
43
|
+
* `ngCarousel` in a separate component.
|
44
|
+
*
|
45
|
+
* # Usage
|
46
|
+
* The `$swipe` service is an object with a single method: `bind`. `bind` takes an element
|
47
|
+
* which is to be watched for swipes, and an object with four handler functions. See the
|
48
|
+
* documentation for `bind` below.
|
49
|
+
*/
|
50
|
+
|
51
|
+
ngTouch.factory('$swipe', [function() {
|
52
|
+
// The total distance in any direction before we make the call on swipe vs. scroll.
|
53
|
+
var MOVE_BUFFER_RADIUS = 10;
|
54
|
+
|
55
|
+
function getCoordinates(event) {
|
56
|
+
var touches = event.touches && event.touches.length ? event.touches : [event];
|
57
|
+
var e = (event.changedTouches && event.changedTouches[0]) ||
|
58
|
+
(event.originalEvent && event.originalEvent.changedTouches &&
|
59
|
+
event.originalEvent.changedTouches[0]) ||
|
60
|
+
touches[0].originalEvent || touches[0];
|
61
|
+
|
62
|
+
return {
|
63
|
+
x: e.clientX,
|
64
|
+
y: e.clientY
|
65
|
+
};
|
66
|
+
}
|
67
|
+
|
68
|
+
return {
|
69
|
+
/**
|
70
|
+
* @ngdoc method
|
71
|
+
* @name $swipe#bind
|
72
|
+
*
|
73
|
+
* @description
|
74
|
+
* The main method of `$swipe`. It takes an element to be watched for swipe motions, and an
|
75
|
+
* object containing event handlers.
|
76
|
+
*
|
77
|
+
* The four events are `start`, `move`, `end`, and `cancel`. `start`, `move`, and `end`
|
78
|
+
* receive as a parameter a coordinates object of the form `{ x: 150, y: 310 }`.
|
79
|
+
*
|
80
|
+
* `start` is called on either `mousedown` or `touchstart`. After this event, `$swipe` is
|
81
|
+
* watching for `touchmove` or `mousemove` events. These events are ignored until the total
|
82
|
+
* distance moved in either dimension exceeds a small threshold.
|
83
|
+
*
|
84
|
+
* Once this threshold is exceeded, either the horizontal or vertical delta is greater.
|
85
|
+
* - If the horizontal distance is greater, this is a swipe and `move` and `end` events follow.
|
86
|
+
* - If the vertical distance is greater, this is a scroll, and we let the browser take over.
|
87
|
+
* A `cancel` event is sent.
|
88
|
+
*
|
89
|
+
* `move` is called on `mousemove` and `touchmove` after the above logic has determined that
|
90
|
+
* a swipe is in progress.
|
91
|
+
*
|
92
|
+
* `end` is called when a swipe is successfully completed with a `touchend` or `mouseup`.
|
93
|
+
*
|
94
|
+
* `cancel` is called either on a `touchcancel` from the browser, or when we begin scrolling
|
95
|
+
* as described above.
|
96
|
+
*
|
97
|
+
*/
|
98
|
+
bind: function(element, eventHandlers) {
|
99
|
+
// Absolute total movement, used to control swipe vs. scroll.
|
100
|
+
var totalX, totalY;
|
101
|
+
// Coordinates of the start position.
|
102
|
+
var startCoords;
|
103
|
+
// Last event's position.
|
104
|
+
var lastPos;
|
105
|
+
// Whether a swipe is active.
|
106
|
+
var active = false;
|
107
|
+
|
108
|
+
element.on('touchstart mousedown', function(event) {
|
109
|
+
startCoords = getCoordinates(event);
|
110
|
+
active = true;
|
111
|
+
totalX = 0;
|
112
|
+
totalY = 0;
|
113
|
+
lastPos = startCoords;
|
114
|
+
eventHandlers['start'] && eventHandlers['start'](startCoords, event);
|
115
|
+
});
|
116
|
+
|
117
|
+
element.on('touchcancel', function(event) {
|
118
|
+
active = false;
|
119
|
+
eventHandlers['cancel'] && eventHandlers['cancel'](event);
|
120
|
+
});
|
121
|
+
|
122
|
+
element.on('touchmove mousemove', function(event) {
|
123
|
+
if (!active) return;
|
124
|
+
|
125
|
+
// Android will send a touchcancel if it thinks we're starting to scroll.
|
126
|
+
// So when the total distance (+ or - or both) exceeds 10px in either direction,
|
127
|
+
// we either:
|
128
|
+
// - On totalX > totalY, we send preventDefault() and treat this as a swipe.
|
129
|
+
// - On totalY > totalX, we let the browser handle it as a scroll.
|
130
|
+
|
131
|
+
if (!startCoords) return;
|
132
|
+
var coords = getCoordinates(event);
|
133
|
+
|
134
|
+
totalX += Math.abs(coords.x - lastPos.x);
|
135
|
+
totalY += Math.abs(coords.y - lastPos.y);
|
136
|
+
|
137
|
+
lastPos = coords;
|
138
|
+
|
139
|
+
if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {
|
140
|
+
return;
|
141
|
+
}
|
142
|
+
|
143
|
+
// One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.
|
144
|
+
if (totalY > totalX) {
|
145
|
+
// Allow native scrolling to take over.
|
146
|
+
active = false;
|
147
|
+
eventHandlers['cancel'] && eventHandlers['cancel'](event);
|
148
|
+
return;
|
149
|
+
} else {
|
150
|
+
// Prevent the browser from scrolling.
|
151
|
+
event.preventDefault();
|
152
|
+
eventHandlers['move'] && eventHandlers['move'](coords, event);
|
153
|
+
}
|
154
|
+
});
|
155
|
+
|
156
|
+
element.on('touchend mouseup', function(event) {
|
157
|
+
if (!active) return;
|
158
|
+
active = false;
|
159
|
+
eventHandlers['end'] && eventHandlers['end'](getCoordinates(event), event);
|
160
|
+
});
|
161
|
+
}
|
162
|
+
};
|
163
|
+
}]);
|
164
|
+
|
165
|
+
/* global ngTouch: false */
|
19
166
|
|
20
167
|
/**
|
21
168
|
* @ngdoc directive
|
22
|
-
* @name
|
169
|
+
* @name ngClick
|
23
170
|
*
|
24
171
|
* @description
|
25
172
|
* A more powerful replacement for the default ngClick designed to be used on touchscreen
|
@@ -27,6 +174,8 @@ var ngMobile = angular.module('ngMobile', []);
|
|
27
174
|
* the click event. This version handles them immediately, and then prevents the
|
28
175
|
* following click event from propagating.
|
29
176
|
*
|
177
|
+
* Requires the {@link ngTouch `ngTouch`} module to be installed.
|
178
|
+
*
|
30
179
|
* This directive can fall back to using an ordinary click event, and so works on desktop
|
31
180
|
* browsers as well as mobile.
|
32
181
|
*
|
@@ -38,17 +187,17 @@ var ngMobile = angular.module('ngMobile', []);
|
|
38
187
|
* upon tap. (Event object is available as `$event`)
|
39
188
|
*
|
40
189
|
* @example
|
41
|
-
<
|
42
|
-
<
|
190
|
+
<example>
|
191
|
+
<file name="index.html">
|
43
192
|
<button ng-click="count = count + 1" ng-init="count=0">
|
44
193
|
Increment
|
45
194
|
</button>
|
46
195
|
count: {{ count }}
|
47
|
-
</
|
48
|
-
</
|
196
|
+
</file>
|
197
|
+
</example>
|
49
198
|
*/
|
50
199
|
|
51
|
-
|
200
|
+
ngTouch.config(['$provide', function($provide) {
|
52
201
|
$provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
|
53
202
|
// drop the default ngClick directive
|
54
203
|
$delegate.shift();
|
@@ -56,7 +205,7 @@ ngMobile.config(['$provide', function($provide) {
|
|
56
205
|
}]);
|
57
206
|
}]);
|
58
207
|
|
59
|
-
|
208
|
+
ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
60
209
|
function($parse, $timeout, $rootElement) {
|
61
210
|
var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag.
|
62
211
|
var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers.
|
@@ -66,6 +215,7 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
66
215
|
var ACTIVE_CLASS_NAME = 'ng-click-active';
|
67
216
|
var lastPreventedTime;
|
68
217
|
var touchCoordinates;
|
218
|
+
var lastLabelClickCoordinates;
|
69
219
|
|
70
220
|
|
71
221
|
// TAP EVENTS AND GHOST CLICKS
|
@@ -137,10 +287,23 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
137
287
|
var y = touches[0].clientY;
|
138
288
|
// Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label
|
139
289
|
// and on the input element). Depending on the exact browser, this second click we don't want
|
140
|
-
// to bust has either (0,0) or
|
290
|
+
// to bust has either (0,0), negative coordinates, or coordinates equal to triggering label
|
291
|
+
// click event
|
141
292
|
if (x < 1 && y < 1) {
|
142
293
|
return; // offscreen
|
143
294
|
}
|
295
|
+
if (lastLabelClickCoordinates &&
|
296
|
+
lastLabelClickCoordinates[0] === x && lastLabelClickCoordinates[1] === y) {
|
297
|
+
return; // input click triggered by label click
|
298
|
+
}
|
299
|
+
// reset label click coordinates on first subsequent click
|
300
|
+
if (lastLabelClickCoordinates) {
|
301
|
+
lastLabelClickCoordinates = null;
|
302
|
+
}
|
303
|
+
// remember label click coordinates to prevent click busting of trigger click event on input
|
304
|
+
if (event.target.tagName.toLowerCase() === 'label') {
|
305
|
+
lastLabelClickCoordinates = [x, y];
|
306
|
+
}
|
144
307
|
|
145
308
|
// Look for an allowable region containing this click.
|
146
309
|
// If we find one, that means it was created by touchstart and not removed by
|
@@ -152,6 +315,9 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
152
315
|
// If we didn't find an allowable region, bust the click.
|
153
316
|
event.stopPropagation();
|
154
317
|
event.preventDefault();
|
318
|
+
|
319
|
+
// Blur focused form elements
|
320
|
+
event.target && event.target.blur();
|
155
321
|
}
|
156
322
|
|
157
323
|
|
@@ -202,7 +368,7 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
202
368
|
element.removeClass(ACTIVE_CLASS_NAME);
|
203
369
|
}
|
204
370
|
|
205
|
-
element.
|
371
|
+
element.on('touchstart', function(event) {
|
206
372
|
tapping = true;
|
207
373
|
tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement.
|
208
374
|
// Hack for Safari, which can target text nodes instead of containers.
|
@@ -220,15 +386,15 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
220
386
|
touchStartY = e.clientY;
|
221
387
|
});
|
222
388
|
|
223
|
-
element.
|
389
|
+
element.on('touchmove', function(event) {
|
224
390
|
resetState();
|
225
391
|
});
|
226
392
|
|
227
|
-
element.
|
393
|
+
element.on('touchcancel', function(event) {
|
228
394
|
resetState();
|
229
395
|
});
|
230
396
|
|
231
|
-
element.
|
397
|
+
element.on('touchend', function(event) {
|
232
398
|
var diff = Date.now() - startTime;
|
233
399
|
|
234
400
|
var touches = (event.changedTouches && event.changedTouches.length) ? event.changedTouches :
|
@@ -249,10 +415,9 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
249
415
|
tapElement.blur();
|
250
416
|
}
|
251
417
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
});
|
418
|
+
if (!angular.isDefined(attr.disabled) || attr.disabled === false) {
|
419
|
+
element.triggerHandler('click', [event]);
|
420
|
+
}
|
256
421
|
}
|
257
422
|
|
258
423
|
resetState();
|
@@ -262,42 +427,50 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
262
427
|
// something else nearby.
|
263
428
|
element.onclick = function(event) { };
|
264
429
|
|
265
|
-
//
|
266
|
-
//
|
267
|
-
// desktop
|
268
|
-
|
430
|
+
// Actual click handler.
|
431
|
+
// There are three different kinds of clicks, only two of which reach this point.
|
432
|
+
// - On desktop browsers without touch events, their clicks will always come here.
|
433
|
+
// - On mobile browsers, the simulated "fast" click will call this.
|
434
|
+
// - But the browser's follow-up slow click will be "busted" before it reaches this handler.
|
435
|
+
// Therefore it's safe to use this directive on both mobile and desktop.
|
436
|
+
element.on('click', function(event, touchend) {
|
269
437
|
scope.$apply(function() {
|
270
|
-
clickHandler(scope, {$event: event});
|
438
|
+
clickHandler(scope, {$event: (touchend || event)});
|
271
439
|
});
|
272
440
|
});
|
273
441
|
|
274
|
-
element.
|
442
|
+
element.on('mousedown', function(event) {
|
275
443
|
element.addClass(ACTIVE_CLASS_NAME);
|
276
444
|
});
|
277
445
|
|
278
|
-
element.
|
446
|
+
element.on('mousemove mouseup', function(event) {
|
279
447
|
element.removeClass(ACTIVE_CLASS_NAME);
|
280
448
|
});
|
281
449
|
|
282
450
|
};
|
283
451
|
}]);
|
284
452
|
|
453
|
+
/* global ngTouch: false */
|
454
|
+
|
285
455
|
/**
|
286
456
|
* @ngdoc directive
|
287
|
-
* @name
|
457
|
+
* @name ngSwipeLeft
|
288
458
|
*
|
289
459
|
* @description
|
290
460
|
* Specify custom behavior when an element is swiped to the left on a touchscreen device.
|
291
461
|
* A leftward swipe is a quick, right-to-left slide of the finger.
|
292
|
-
* Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag
|
462
|
+
* Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag
|
463
|
+
* too.
|
464
|
+
*
|
465
|
+
* Requires the {@link ngTouch `ngTouch`} module to be installed.
|
293
466
|
*
|
294
467
|
* @element ANY
|
295
468
|
* @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate
|
296
469
|
* upon left swipe. (Event object is available as `$event`)
|
297
470
|
*
|
298
471
|
* @example
|
299
|
-
<
|
300
|
-
<
|
472
|
+
<example>
|
473
|
+
<file name="index.html">
|
301
474
|
<div ng-show="!showActions" ng-swipe-left="showActions = true">
|
302
475
|
Some list content, like an email in the inbox
|
303
476
|
</div>
|
@@ -305,26 +478,29 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
305
478
|
<button ng-click="reply()">Reply</button>
|
306
479
|
<button ng-click="delete()">Delete</button>
|
307
480
|
</div>
|
308
|
-
</
|
309
|
-
</
|
481
|
+
</file>
|
482
|
+
</example>
|
310
483
|
*/
|
311
484
|
|
312
485
|
/**
|
313
486
|
* @ngdoc directive
|
314
|
-
* @name
|
487
|
+
* @name ngSwipeRight
|
315
488
|
*
|
316
489
|
* @description
|
317
490
|
* Specify custom behavior when an element is swiped to the right on a touchscreen device.
|
318
491
|
* A rightward swipe is a quick, left-to-right slide of the finger.
|
319
|
-
* Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag
|
492
|
+
* Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag
|
493
|
+
* too.
|
494
|
+
*
|
495
|
+
* Requires the {@link ngTouch `ngTouch`} module to be installed.
|
320
496
|
*
|
321
497
|
* @element ANY
|
322
498
|
* @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate
|
323
499
|
* upon right swipe. (Event object is available as `$event`)
|
324
500
|
*
|
325
501
|
* @example
|
326
|
-
<
|
327
|
-
<
|
502
|
+
<example>
|
503
|
+
<file name="index.html">
|
328
504
|
<div ng-show="!showActions" ng-swipe-left="showActions = true">
|
329
505
|
Some list content, like an email in the inbox
|
330
506
|
</div>
|
@@ -332,41 +508,25 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
332
508
|
<button ng-click="reply()">Reply</button>
|
333
509
|
<button ng-click="delete()">Delete</button>
|
334
510
|
</div>
|
335
|
-
</
|
336
|
-
</
|
511
|
+
</file>
|
512
|
+
</example>
|
337
513
|
*/
|
338
514
|
|
339
|
-
function makeSwipeDirective(directiveName, direction) {
|
340
|
-
|
515
|
+
function makeSwipeDirective(directiveName, direction, eventName) {
|
516
|
+
ngTouch.directive(directiveName, ['$parse', '$swipe', function($parse, $swipe) {
|
341
517
|
// The maximum vertical delta for a swipe should be less than 75px.
|
342
518
|
var MAX_VERTICAL_DISTANCE = 75;
|
343
519
|
// Vertical distance should not be more than a fraction of the horizontal distance.
|
344
520
|
var MAX_VERTICAL_RATIO = 0.3;
|
345
521
|
// At least a 30px lateral motion is necessary for a swipe.
|
346
522
|
var MIN_HORIZONTAL_DISTANCE = 30;
|
347
|
-
// The total distance in any direction before we make the call on swipe vs. scroll.
|
348
|
-
var MOVE_BUFFER_RADIUS = 10;
|
349
|
-
|
350
|
-
function getCoordinates(event) {
|
351
|
-
var touches = event.touches && event.touches.length ? event.touches : [event];
|
352
|
-
var e = (event.changedTouches && event.changedTouches[0]) ||
|
353
|
-
(event.originalEvent && event.originalEvent.changedTouches &&
|
354
|
-
event.originalEvent.changedTouches[0]) ||
|
355
|
-
touches[0].originalEvent || touches[0];
|
356
|
-
|
357
|
-
return {
|
358
|
-
x: e.clientX,
|
359
|
-
y: e.clientY
|
360
|
-
};
|
361
|
-
}
|
362
523
|
|
363
524
|
return function(scope, element, attr) {
|
364
525
|
var swipeHandler = $parse(attr[directiveName]);
|
526
|
+
|
365
527
|
var startCoords, valid;
|
366
|
-
var totalX, totalY;
|
367
|
-
var lastX, lastY;
|
368
528
|
|
369
|
-
function validSwipe(
|
529
|
+
function validSwipe(coords) {
|
370
530
|
// Check that it's within the coordinates.
|
371
531
|
// Absolute vertical distance must be within tolerances.
|
372
532
|
// Horizontal distance, we take the current X - the starting X.
|
@@ -376,7 +536,6 @@ function makeSwipeDirective(directiveName, direction) {
|
|
376
536
|
// illegal ones a negative delta.
|
377
537
|
// Therefore this delta must be positive, and larger than the minimum.
|
378
538
|
if (!startCoords) return false;
|
379
|
-
var coords = getCoordinates(event);
|
380
539
|
var deltaY = Math.abs(coords.y - startCoords.y);
|
381
540
|
var deltaX = (coords.x - startCoords.x) * direction;
|
382
541
|
return valid && // Short circuit for already-invalidated swipes.
|
@@ -386,65 +545,21 @@ function makeSwipeDirective(directiveName, direction) {
|
|
386
545
|
deltaY / deltaX < MAX_VERTICAL_RATIO;
|
387
546
|
}
|
388
547
|
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
lastY = startCoords.y;
|
396
|
-
});
|
397
|
-
|
398
|
-
element.bind('touchcancel', function(event) {
|
399
|
-
valid = false;
|
400
|
-
});
|
401
|
-
|
402
|
-
element.bind('touchmove mousemove', function(event) {
|
403
|
-
if (!valid) return;
|
404
|
-
|
405
|
-
// Android will send a touchcancel if it thinks we're starting to scroll.
|
406
|
-
// So when the total distance (+ or - or both) exceeds 10px in either direction,
|
407
|
-
// we either:
|
408
|
-
// - On totalX > totalY, we send preventDefault() and treat this as a swipe.
|
409
|
-
// - On totalY > totalX, we let the browser handle it as a scroll.
|
410
|
-
|
411
|
-
// Invalidate a touch while it's in progress if it strays too far away vertically.
|
412
|
-
// We don't want a scroll down and back up while drifting sideways to be a swipe just
|
413
|
-
// because you happened to end up vertically close in the end.
|
414
|
-
if (!startCoords) return;
|
415
|
-
var coords = getCoordinates(event);
|
416
|
-
|
417
|
-
if (Math.abs(coords.y - startCoords.y) > MAX_VERTICAL_DISTANCE) {
|
418
|
-
valid = false;
|
419
|
-
return;
|
420
|
-
}
|
421
|
-
|
422
|
-
totalX += Math.abs(coords.x - lastX);
|
423
|
-
totalY += Math.abs(coords.y - lastY);
|
424
|
-
|
425
|
-
lastX = coords.x;
|
426
|
-
lastY = coords.y;
|
427
|
-
|
428
|
-
if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {
|
429
|
-
return;
|
430
|
-
}
|
431
|
-
|
432
|
-
// One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.
|
433
|
-
if (totalY > totalX) {
|
548
|
+
$swipe.bind(element, {
|
549
|
+
'start': function(coords, event) {
|
550
|
+
startCoords = coords;
|
551
|
+
valid = true;
|
552
|
+
},
|
553
|
+
'cancel': function(event) {
|
434
554
|
valid = false;
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
// Prevent this swipe from bubbling up to any other elements with ngSwipes.
|
444
|
-
event.stopPropagation();
|
445
|
-
scope.$apply(function() {
|
446
|
-
swipeHandler(scope, {$event:event});
|
447
|
-
});
|
555
|
+
},
|
556
|
+
'end': function(coords, event) {
|
557
|
+
if (validSwipe(coords)) {
|
558
|
+
scope.$apply(function() {
|
559
|
+
element.triggerHandler(eventName);
|
560
|
+
swipeHandler(scope, {$event: event});
|
561
|
+
});
|
562
|
+
}
|
448
563
|
}
|
449
564
|
});
|
450
565
|
};
|
@@ -452,8 +567,8 @@ function makeSwipeDirective(directiveName, direction) {
|
|
452
567
|
}
|
453
568
|
|
454
569
|
// Left is negative X-coordinate, right is positive.
|
455
|
-
makeSwipeDirective('ngSwipeLeft', -1);
|
456
|
-
makeSwipeDirective('ngSwipeRight', 1);
|
570
|
+
makeSwipeDirective('ngSwipeLeft', -1, 'swipeleft');
|
571
|
+
makeSwipeDirective('ngSwipeRight', 1, 'swiperight');
|
457
572
|
|
458
573
|
|
459
574
|
|