diff options
Diffstat (limited to 'src/ng/directive/ngRepeat.js')
| -rw-r--r-- | src/ng/directive/ngRepeat.js | 34 | 
1 files changed, 9 insertions, 25 deletions
| diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 021845fa..8c934b76 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -88,7 +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 ngRepeatWatch(scope){          var index, length,              collection = scope.$eval(rhs), @@ -119,18 +119,14 @@ var ngRepeatDirective = ngDirective({            key = (collection === array) ? index : array[index];            value = collection[key]; -          // 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 value is object, it can be shifted to allow for position change +          // if is not object, need to first check whether index is same to avoid shifting wrong val +          last = isObject(value) +              ? lastOrder.shift(value) +              : (last = lastOrder.peek(value)) && (index === last.index) +                  ? lastOrder.shift(value) +                  : undefined; +            if (last) {              // if we have already seen this object, then we need to reuse the @@ -151,12 +147,6 @@ 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();            } @@ -178,16 +168,10 @@ 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)) { | 
