Вот еще один способ, к которому можно приблизиться. Я удалил директиву ng-if
, так как она не нужна. В вашей первой директиве ng-repeat
объект article доступен в используемой области. $scope.hoverMode
был удален в пользу добавления attr к каждой статье под названием limit
.
Событие ng-mouseover
, которое я заменил в пользу ng-mouseenter
, так как это событие, параллельное ng-mouseleave
. Вместо того, чтобы эти директивы вызывали функцию, предельным значением манипулируют с помощью простого выражения в DOM.
Я оставил функцию showAllCat()
в коде с изменениями. Он принимает объект статьи в качестве параметра для непосредственного управления категорией.
Если limit
var равен undefined
, то в фильтре нет ограничения по пределу.
Удаляя ng-if
, вы удаляете количество слушателей, равное количеству статей. Так как в этом не было необходимости, это просто дополнительные накладные расходы.
// Code goes here
angular
.module('myApp', [])
.controller('myController', ($scope) => {
$scope.minLimit = 2;
$scope.maxLimit = undefined;
$scope.articles = [{
date: 'some',
category: [{
name: "Sports"
}, {
name: "News"
}, {
name: "Cinema"
}]
}, {
date: 'some',
category: [{
name: "A"
}, {
name: "B"
}, {
name: "C"
}]
}, {
date: 'some',
category: [{
name: "D"
}, {
name: "E"
}, {
name: "F"
}]
}];
$scope.articles.forEach((article)=>{article.limit=$scope.minLimit});
$scope.showAllcat = function(article) {
console.log('hover working');
article.limit = article.limit === minLimit ? maxLimit : minLimit;
}
});
<!DOCTYPE html>
<html ng-app='myApp'>
<head>
<script data-require="angular.js@4.0.0" data-semver="4.0.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.10/angular.min.js"></script>
<script data-require="angular.js@4.0.0" data-semver="4.0.0" src="script.ts"></script>
<script data-require="angular.js@4.0.0" data-semver="4.0.0" src="system.config.js"></script>
<script data-require="angular.js@4.0.0" data-semver="4.0.0" src="tsconfig.json"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller='myController'>
<table>
<tbody>
<tr>
<th>Date</th>
<th>Categories</th>
</tr>
<tr ng-repeat="article in articles"
ng-mouseenter="article.limit = maxLimit"
ng-mouseleave="article.limit = minLimit">
<td><span>{{ article.date }}</span></td>
<td><span ng-repeat="cat in article.category | limitTo: article.limit">
<span class="label label-warning">{{cat.name}}
</span>
</span>
</td>
</tr>
</tbody>
</table>
</body>
</html>