-
Notifications
You must be signed in to change notification settings - Fork 1
/
repeatComplete.js
76 lines (66 loc) · 1.65 KB
/
repeatComplete.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
(function() {
'use strict';
angular
.module('repeatComplete', []); // module setter
angular
.module('repeatComplete') // module getter
.directive('repeatComplete', repeatComplete);
/**
* USAGE:
*
* VIEW: <li ng-repeat="item in items" repeat-complete>
* JS: $scope.$on('repeat-complete', function($event, args) {});
*
* VIEW: <li ng-repeat="item in items" repeat-complete event="itemsDone">
* JS: $scope.$on('itemsDone', function($event, args) {});
*
* VIEW: <li ng-repeat="thing in things" repeat-complete callback="thingsDone()">
* JS: $scope.thingsDone = function() { ... }
*/
repeatComplete.$inject = ['$timeout'];
function repeatComplete($timeout) {
// return directive
return {
restrict: 'A',
link: repeatCompleteLink
};
/**
* repeat-complete-event LINK function
*
* @param $scope
* @param $element
* @param $attrs
*/
function repeatCompleteLink($scope, $element, $attrs) {
var _event = $attrs.event;
var _callback = $attrs.callback;
/**
* $last DOM element rendered:
* $emit event and/or run callback
*
* @private
*/
function _repeatCompleted() {
var args = {
lastElement: $element,
parent: $element.parent()
};
// custom event name, $emit custom event
if (_event) {
$scope.$emit(_event, args);
}
// callback, execute callback function
if (_callback) {
$scope.$eval(_callback);
}
// no custom event name OR callback, $emit generic event
if (!_event && !_callback) {
$scope.$emit('repeat-complete', args);
}
}
if ($scope.$last === true) {
$timeout(_repeatCompleted);
}
}
}
})();