ng-if
của bạn sẽ được gọi trên mọi vòng lặp thông báo. Vấn đề là nó chứa một biểu thức liên quan đến một lời gọi hàm. Angular không có cách nào để biết khi nào kết quả của biểu thức có thể thay đổi, vì vậy nó luôn gọi nó.
Một lựa chọn tốt hơn sẽ là đặt một cờ trong mỗi kênh và sử dụng ng-if để chỉ kiểm tra cờ liên quan. Sau đó, bạn chỉ cần cập nhật cờ bất cứ khi nào $scope.activeCategory
những thay đổi mà bạn có thể thực hiện với mã nơi bạn đặt danh mục hoặc sử dụng $scope.$watch()
để kích hoạt nó tự động.
ví dụ:
$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;
}
}
Sau đó, trong mẫu của bạn:
<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>
sẽ hiệu quả hơn.