Din ng-if
kommer att anropas på varje sammanfattningsslinga. Problemet är att det innehåller ett uttryck som involverar ett funktionsanrop. Angular har inget sätt att veta när resultatet av uttrycket kan ändras, så det anropar det varje gång.
Ett bättre alternativ skulle vara att sätta en flagga i var och en av kanalerna och använda ng-if för att bara testa den relevanta flaggan. Sedan behöver du bara uppdatera flaggorna när $scope.activeCategory
ändringar som du antingen kan göra med kod där du ställer in kategorin eller med $scope.$watch()
för att utlösa den automatiskt.
t.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;
}
}
Sedan i din mall:
<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>
borde vara effektivare.