Váš ng-if
bude volána v každé smyčce digest. Problém je v tom, že obsahuje výraz zahrnující volání funkce. Angular nemá žádný způsob, jak zjistit, kdy se výsledek výrazu může změnit, takže jej volá pokaždé.
Lepší možností by bylo nastavit příznak v každém z kanálů a pomocí ng-if pouze otestovat příslušný příznak. Pak stačí aktualizovat příznaky kdykoli $scope.activeCategory
změny, které můžete provést buď pomocí kódu, kde nastavujete kategorii, nebo pomocí $scope.$watch()
pro automatické spuštění.
např.
$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;
}
}
Poté ve vaší šabloně:
<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>
by měl být efektivnější.