sql >> Databasteknik >  >> NoSQL >> MongoDB

ng-om blir uppringd fler gånger än det borde

Din ng-if kommer att anropas på varje sammanfattningsslinga. Problemet är att det innehåller ett uttryck som involverar ett funktionsanrop. Angular har inget sätt att veta när resultatet av uttrycket kan ändras, så det anropar det varje gång.

Ett bättre alternativ skulle vara att sätta en flagga i var och en av kanalerna och använda ng-if för att bara testa den relevanta flaggan. Sedan behöver du bara uppdatera flaggorna när $scope.activeCategory ändringar som du antingen kan göra med kod där du ställer in kategorin eller med $scope.$watch() för att utlösa den automatiskt.

t.ex.

$scope.setCategory = function (name) {
  $scope.activeCategory = name;
  for (var index=0; index < $scope.channels.length; index++) {
      $scope.channels[index].hasCategory = hasCategory($scope.channels[index].category, name);
  }
};

function hasCategory(categoryNameArray, name) {
  console.log('thisisbeingcalled');
  var e = _.indexOf(categoryNameArray, name);
  if (e === -1) {
    return false;
  } else {
    return true;
  }
}

Sedan i din mall:

<md-card flex="15" flex-xs="40" class="slide-up" layout="column"
    ng-repeat="channel in channels | orderBy: 'number' | filter: queryname"
    ng-if="channel.hasCategory"
    ng-init="channel.edit = false">
  <md-card-header ng-show="channel.edit == false">
    <img ng-src="{{channel.logo}}" alt="">
  </md-card-header>
  <md-card-header-text ng-show="channel.edit == false">
    <span class="md-subhead dark-blue" layout="row" layout-align="center" layout-margin>{{channel.number}}</span>
  </md-card-header-text>
</md-card>

borde vara effektivare.




  1. MongoDB-prestanda:Kör MongoDB-aggregeringar på sekundärer

  2. Mongodb - $grupp i en $grupp (med 'nyckel')

  3. Hur man konverterar ett kommaseparerat strängfält till array i mongodb

  4. Uppdatera många om det finns , annars skapa ett nytt dokument för varje LeadId som inte finns