-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathangular-for.js
More file actions
104 lines (90 loc) · 2.56 KB
/
Copy pathangular-for.js
File metadata and controls
104 lines (90 loc) · 2.56 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
(function angularFor(window, document, undefined) {
'use strict';
angular.module('bl.ngFor', [])
.directive('ngFor', ['$animate',
function ($animate) {
return {
restrict: 'A',
multiElement: true,
transclude: 'element',
priority: 1000,
terminal: true,
link: function ($scope, $element, attr, nullCtrl, $transclude) {
var attribute = attr.ngFor;
var limit;
var index;
$scope.attributeVal = $scope[attribute];
// based on ngRepeat.js v1.2.21
// Store a list of elements from previous run. This is a hash where key is the item from the
// iterator, and the value is objects with following properties.
// - scope: bound scope
// - element: previous element.
// - index: position
var elementHash = [];
// handle scope parameter
if (isNaN(parseInt(attribute, 10))) {
if (typeof (attribute) === 'string') {
$scope.$watch(attribute, function () {
limit = $scope[attribute];
cullHash();
for (index = 0; index < limit; index++) {
loop(index);
}
});
}
}
// handle Numerical values
// these do not update so no reason to run cullHash
else {
limit = attribute;
for (index = 0; index < limit; index++) {
loop(index);
}
}
function loop(index) {
// New items
if (elementHash.length <= index) {
$transclude(function (clone, scope) {
addElement(clone, scope, index);
});
}
// Update item
else {
updateScope(elementHash[index].scope, index);
}
}
function cullHash() {
var i;
var startingLength = elementHash.length;
if (startingLength > limit) {
for (i = limit; i < startingLength; i++) {
var hashItem = elementHash.pop();
removeElement(hashItem);
}
}
}
function addElement(clone, scope, index) {
updateScope(scope, index);
elementHash.push({
scope: scope,
element: clone
});
$animate.enter(clone, null, $element);
}
function removeElement(hashItem) {
$animate.leave(hashItem.element);
}
// based on ngRepeat.js v1.2.21
function updateScope(scope, index) {
scope.$index = limit - index;
scope.$first = (index === (limit - 1));
scope.$last = (index === 0);
scope.$middle = !(scope.$first || scope.$last);
// jshint bitwise: false
scope.$odd = !(scope.$even = (index & 1) !== 0);
// jshint bitwise: true
}
}
};
}]);
})(window, document);