aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/directive/ngRepeat.js
diff options
context:
space:
mode:
authorZhenbo Zhang2012-05-09 00:00:38 +0300
committerMisko Hevery2012-08-30 15:20:40 -0700
commit0a71753ce3f4fe241e15fa489617b82710be4648 (patch)
tree54877a72b6621b469f89f45f26acdee4310b973d /src/ng/directive/ngRepeat.js
parent1a8642aac2de40dccdab464e58dc164006c300bb (diff)
downloadangular.js-0a71753ce3f4fe241e15fa489617b82710be4648.tar.bz2
fix(ng-repeat) to work with primitive types
Diffstat (limited to 'src/ng/directive/ngRepeat.js')
-rw-r--r--src/ng/directive/ngRepeat.js28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js
index 6dd74ef5..a47b7abc 100644
--- a/src/ng/directive/ngRepeat.js
+++ b/src/ng/directive/ngRepeat.js
@@ -88,6 +88,7 @@ var ngRepeatDirective = ngDirective({
// We need an array of these objects since the same object can be returned from the iterator.
// We expect this to be a rare case.
var lastOrder = new HashQueueMap();
+ var indexValues = [];
scope.$watch(function(scope){
var index, length,
collection = scope.$eval(rhs),
@@ -117,7 +118,20 @@ var ngRepeatDirective = ngDirective({
for (index = 0, length = array.length; index < length; index++) {
key = (collection === array) ? index : array[index];
value = collection[key];
- last = lastOrder.shift(value);
+
+ // if collection is array and value is object, it can be shifted to allow for position change
+ // if collection is array and value is not object, need to first check whether index is same to
+ // avoid shifting wrong value
+ // if collection is not array, need to always check index to avoid shifting wrong value
+ if (lastOrder.peek(value)) {
+ last = collection === array ?
+ ((isObject(value)) ? lastOrder.shift(value) :
+ (index === lastOrder.peek(value).index ? lastOrder.shift(value) : undefined)) :
+ (index === lastOrder.peek(value).index ? lastOrder.shift(value) : undefined);
+ } else {
+ last = undefined;
+ }
+
if (last) {
// if we have already seen this object, then we need to reuse the
// associated scope/element
@@ -137,6 +151,12 @@ var ngRepeatDirective = ngDirective({
cursor = last.element;
}
} else {
+ if (indexValues.hasOwnProperty(index) && collection !== array) {
+ var preValue = indexValues[index];
+ var v = lastOrder.shift(preValue);
+ v.element.remove();
+ v.scope.$destroy();
+ }
// new item which we don't know about
childScope = scope.$new();
}
@@ -158,10 +178,16 @@ var ngRepeatDirective = ngDirective({
index: index
};
nextOrder.push(value, last);
+ indexValues[index] = value;
});
}
}
+ var i, l;
+ for (i = 0, l = indexValues.length - length; i < l; i++) {
+ indexValues.pop();
+ }
+
//shrink children
for (key in lastOrder) {
if (lastOrder.hasOwnProperty(key)) {