diff options
| author | R. Merkert | 2013-04-16 20:09:43 -0400 | 
|---|---|---|
| committer | Pete Bacon Darwin | 2013-05-08 12:45:32 +0100 | 
| commit | 6d0b325f7f5b9c1f3cfac9b73c6cd5fc3d1e2af0 (patch) | |
| tree | 0e4d9d260888a5f242c3d8fa18207c9cbb0de002 /src | |
| parent | cf4729faa3e6e0a5178e2064a6f3cfd345686554 (diff) | |
| download | angular.js-6d0b325f7f5b9c1f3cfac9b73c6cd5fc3d1e2af0.tar.bz2 | |
fix(angular): do not copy $$hashKey in copy/extend functions.
Copying the $$hashKey as part of copy/extend operations makes little
sense since hashkey is used primarily as an object id, especially in
the context of the ngRepeat directive. This change maintains the
existing $$hashKey of an object that is being copied into (likewise for
extend).
It is not uncommon to take an item in a collection, copy it,
and then append it to the collection. By copying the $$hashKey, this
leads to duplicate object errors with the current ngRepeat.
Closes #1875
Diffstat (limited to 'src')
| -rw-r--r-- | src/Angular.js | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/src/Angular.js b/src/Angular.js index bf64c6c2..45023d6c 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -215,6 +215,21 @@ function nextUid() {    return uid.join('');  } + +/** + * Set or clear the hashkey for an object. + * @param obj object  + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { +  if (h) { +    obj.$$hashKey = h; +  } +  else { +    delete obj.$$hashKey; +  } +} +  /**   * @ngdoc function   * @name angular.extend @@ -228,6 +243,7 @@ function nextUid() {   * @param {...Object} src Source object(s).   */  function extend(dst) { +  var h = dst.$$hashKey;    forEach(arguments, function(obj){      if (obj !== dst) {        forEach(obj, function(value, key){ @@ -235,6 +251,8 @@ function extend(dst) {        });      }    }); + +  setHashKey(dst,h);    return dst;  } @@ -594,12 +612,14 @@ function copy(source, destination){          destination.push(copy(source[i]));        }      } else { +      var h = destination.$$hashKey;        forEach(destination, function(value, key){          delete destination[key];        });        for ( var key in source) {          destination[key] = copy(source[key]);        } +      setHashKey(destination,h);      }    }    return destination; | 
