I'm trying to filter some channels depending on the selected category.
I have an ng-repeat of channel in channels
which has an ng-if="hasCategory(channel.category)
Here's the document:
db.channels.find().pretty()
{
"_id" : "2kj9GK8jE9yHezoWb",
"name" : "example name",
"logo" : "path/to/image.svg",
"number" : 2,
"category" : [
"Broadcast",
"Premium"
],
"tags" : "example tag tags"
}
This is the function to handle the ng-if:
$scope.hasCategory = function (categoryNameArray) {
console.log('thisisbeingcalled');
var e = _.indexOf(categoryNameArray, $scope.activeCategory);
if (e === -1) {
return false;
} else {
return true;
}
};
and this is how I set the active category:
$scope.setCategory = function (name) {
$scope.activeCategory = name;
};
which I send by clicking the button in the view:
<section layout="row" layout-align="center center" layout-wrap ng-init="activeIndex; activeCategory">
<md-button flex="auto" flex-sm="45" flex-xs="100" ng-repeat="kit in kits | orderBy: 'order'" ng-class="{active: (activeIndex.index == $index)}" class="md-raised">
<a href="" ng-click="activeIndex.index = $index; setCategory(kit.name);" class="bold">{{kit.name}}</a>
</md-button>
</section>
here's the kits document schema:
db.kits.find().pretty()
{ "_id" : "k7JFX6DHu5GYnyer3", "name" : "Broadcast", "order" : 1 }
{ "_id" : "KrKRm4gysw5sfQnnr", "name" : "Premium", "order" : 2 }
{ "_id" : "dieukQ3NRsA44CSns", "name" : "Ultimate", "order" : 3 }
Now I only have one channel to test this out, but each time I click the button to change the category, the $scope.hasCategory
function gets called multiple times even at the startup of the page (first time loading)
I also have a search bar to search for channels in the current category, I'm not sure if that affects this as well.
<input type="text" ng-model="queryname" ng-model-options="{debounce: 500}">
Now this gets really laggy when I have more than a 100 channels, the ng-if gets called more than 10k times, which makes the page freeze for quite a while.
What can I do to fix this issue?
EDIT
Forgot to add where the ng-if
was:
<md-card flex="15" flex-xs="40" class="slide-up" layout="column" ng-repeat="channel in channels | orderBy: 'number' | filter: queryname" ng-if="hasCategory(channel.category)" 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>
See Question&Answers more detail:
os