diff options
| author | Zhenbo Zhang | 2012-05-09 00:00:38 +0300 | 
|---|---|---|
| committer | Misko Hevery | 2012-08-30 21:34:41 -0700 | 
| commit | 98d489712eff7559bce87ae53bd242112a875c1a (patch) | |
| tree | 396a38861b2d7c204e86cb537da0ebc74b0a5179 /src/ng | |
| parent | 2cab2d8ef1c2ad2aa919b5a8ad5948977a1b6b84 (diff) | |
| download | angular.js-98d489712eff7559bce87ae53bd242112a875c1a.tar.bz2 | |
fix(ng-repeat) to work with primitive types
Diffstat (limited to 'src/ng')
| -rw-r--r-- | src/ng/directive/ngRepeat.js | 28 | 
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)) {  | 
