Din ng-if
vil blive kaldt på hver digest-loop. Problemet er, at det indeholder et udtryk, der involverer et funktionskald. Angular har ingen måde at vide, hvornår resultatet af udtrykket kan ændre sig, så det kalder det hver gang.
En bedre mulighed ville være at sætte et flag i hver af kanalerne og bruge ng-if til blot at teste det relevante flag. Så skal du bare opdatere flagene hver gang $scope.activeCategory
ændringer, som du enten kan foretage med kode, hvor du indstiller kategorien eller ved at bruge $scope.$watch()
for at udløse den automatisk.
f.eks.
$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;
}
}
Så i din skabelon:
<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>
burde være mere effektiv.