title: Ng-repeat items do not have $$hash key which messing up with the render
body: <p>I have this code for ng-repeat:</p>
  <pre><code>&lt;div class=&quot;col-12 note-list-item&quot;
       ng-repeat=&quot;data in viewModels track by data.id + data.title&quot;
       ng-click=&quot;edit(data.id)&quot;
       ontouchstart=&quot;touchStart()&quot; ontouchend=&quot;touchEnd()&quot; 
       ontouchmove=&quot;touchMove()&quot;&gt;
      &lt;p ng-class=&quot;deleteMode ? 'note-list-title w-80' : 'note-list-title'&quot; ng-bind-html=&quot;data.title&quot;&gt;&lt;/p&gt;
      &lt;p ng-class=&quot;deleteMode ? 'note-list-date w-80' : 'note-list-date'&quot;&gt;{{data.dateCreated | displayDate}}&lt;/p&gt;
      &lt;div ng-if=&quot;deleteMode&quot; class=&quot;note-list-delete ease-in&quot; ng-click=&quot;delete($event, data.id)&quot;&gt;
          &lt;span class=&quot;btn fa fa-trash&quot;&gt;&lt;/span&gt;
      &lt;/div&gt;
  &lt;/div&gt;
  </code></pre>
  <p>There is a problem with the rendering. Every time I update the list (viewModels) by replacing the array, the html element renders a duplicate for a brief millisecond then match the new array. This causes blinking when I update the list.</p>
  <p>After thorough checking, I find out that there is no <code>$$hashKey</code> in the items.</p>
  <p>This is how I load the list:</p>
  <pre><code>$scope.loadViewModels = function (orderBy, table, cb) {
      if (!$scope.endOfPage) {
          let searchKey = $scope.page.searchString;
          let skip = ($scope.currentPage - 1) * $scope.itemsPerPage;
          let searchClause = '';
  
          if (searchKey &amp;&amp; searchKey.length &gt; 0) {
              let searchArr = [];
              $($scope.vmKeys).each((i, key) =&gt; {
                  searchArr.push(key + ` LIKE '%` + searchKey + `%'`);
              });
              searchClause = `WHERE ` + searchArr.join(' OR ');
          }
  
          let sc = `SELECT * FROM ` + table + ` ` + searchClause + ` ` + orderBy +
              ` LIMIT ` + skip + `, ` + $scope.itemsPerPage;
          sqlite.query(sc, rows =&gt; {
              $scope.$apply(function () {
                  var data = [];
                  let loadedCount = 0;
                  if (rows != null) {
                      $scope.currentPage += 1;
                      loadedCount = rows.length;
                      if (rows.length &lt; $scope.itemsPerPage)
                          $scope.endOfPage = true
  
                      for (var i = 0; i &lt; rows.length; i++) {
                          let item = rows.item(i);
                          let returnObject = {};
                          $($scope.vmKeys).each((i, key) =&gt; {
                              returnObject[key] = item[key];
                          });
                          data.push(returnObject);
                      }
  
                      //REPLACING THE ARRAY
                      if ($scope.viewModels != null)
                          $scope.viewModels = $scope.viewModels.concat(data);
                      else
                          $scope.viewModels = data;
                  }
                  else
                      $scope.endOfPage = true;
  
                  if (cb)
                      cb(loadedCount);
              });
          });
      }
  }
  </code></pre>