MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

ng-wenn es öfter gerufen wird, als es sollte

Ihr ng-if wird bei jeder Digest-Schleife aufgerufen. Das Problem ist, dass es einen Ausdruck enthält, der einen Funktionsaufruf beinhaltet. Angular hat keine Möglichkeit zu wissen, wann sich das Ergebnis des Ausdrucks ändern könnte, also ruft es ihn jedes Mal auf.

Eine bessere Option wäre, in jedem der Kanäle ein Flag zu setzen und ng-if zu verwenden, um nur das relevante Flag zu testen. Dann müssen Sie nur die Flags aktualisieren, wann immer $scope.activeCategory Änderungen, die Sie entweder mit Code vornehmen können, in dem Sie die Kategorie festlegen, oder mit $scope.$watch() um es automatisch auszulösen.

z. B.

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

Dann in Ihrer Vorlage:

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

sollte effizienter sein.