MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

ng-si vous êtes appelé plus de fois qu'il ne le devrait

Votre ng-if sera appelé à chaque boucle de résumé. Le problème est qu'il contient une expression impliquant un appel de fonction. Angular n'a aucun moyen de savoir quand le résultat de l'expression peut changer, il l'appelle donc à chaque fois.

Une meilleure option serait de définir un indicateur dans chacun des canaux et d'utiliser ng-if pour tester uniquement l'indicateur pertinent. Ensuite, il vous suffit de mettre à jour les drapeaux chaque fois que $scope.activeCategory changements que vous pouvez faire avec le code où vous définissez la catégorie ou en utilisant $scope.$watch() pour le déclencher automatiquement.

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;
  }
}

Puis dans votre template :

<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>

devrait être plus efficace.