Il tuo ng-if
verrà chiamato in ogni ciclo digest. Il problema è che contiene un'espressione che coinvolge una chiamata di funzione. Angular non ha modo di sapere quando il risultato dell'espressione potrebbe cambiare, quindi lo chiama ogni volta.
Un'opzione migliore sarebbe quella di impostare un flag in ciascuno dei canali e utilizzare ng-if per testare semplicemente il flag pertinente. Quindi devi solo aggiornare i flag ogni volta che $scope.activeCategory
modifiche che puoi eseguire con il codice in cui imposti la categoria o utilizzando $scope.$watch()
per attivarlo automaticamente.
es.
$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;
}
}
Quindi nel tuo modello:
<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>
dovrebbe essere più efficiente.