У меня есть условие, которое необходимо проверить в моем представлении: если у любого пользователя в списке пользователей есть то же имя, что и у другого пользователя, я хочу показать их возраст.
Что-то вроде
<div ng-repeat="user in userList track by $index">
<span class="fa fa-check" ng-if="user.isSelected"></span>{{user.firstName}} <small ng-if="true">{{'AGE' | translate}} {{user.age}}</small>
</div>
за исключением того, что мне не хватает правильного условного
Вы можете имитировать ключ/значение hashmap и проверить, действительно ли ваша карта получила имя свойства. Кроме того, вы можете добавить свойство show для каждого объекта в $ scope.userList
контроллер
(function(){
function Controller($scope) {
var map = {};
$scope.userList = [{
name:'toto',
age: 20,
show: false
}, {
name:'titi',
age: 22,
show: false
}, {
name: 'toto',
age: 22,
show: false
}];
$scope.userList.forEach(function(elm, index){
//if the key elm.name exist in my map
if (map.hasOwnProperty(elm.name)){
//Push the curent index of the userList array at the key elm.name of my map
map[elm.name].push(index);
//For all index at the key elm.name
map[elm.name].forEach(function(value){
//Access to object into userList array with the index
//And set property show to true
$scope.userList[value].show = true;
});
} else {
//create a key elm.name with an array of index as value
map[elm.name] = [index];
}
});
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
HTML
<body ng-app="app" ng-controller="ctrl">
<div ng-repeat="user in userList track by $index">
<span class="fa fa-check"></span>{{user.name}} <small ng-if="user.show">{{'AGE'}} {{user.age}}</small>
</div>
</body>
$scope.userList
. Так что, если я получу ключ, и она тоже на карте, я нашел 2 идентичных имени, поэтому я нажму на индекс, где я смогу найти этот дубликат элемента. Ты понял ?
Вероятно, вы должны запустить некоторый код в контроллере, который добавляет флаг к объекту пользователя, чтобы указать, есть ли у него имя, которое используется другим пользователем.
Вы хотите свести к минимуму количество логики внутри ng-repeat
потому что эта логика будет выполняться для каждого элемента в ng-repeat
каждого $digest
.
Я бы сделал что-то вроде этого:
контроллер
var currUser, tempUser;
for (var i = 0; i < $scope.userList.length; i++) {
currUser = $scope.userList[i];
for (var j = 0; j < $scope.userList.length; j++) {
if (i === j) continue;
var tempUser = $scope.userList[j];
if (currUser.firstName === tempUser.firstName) {
currUser.showAge = true;
}
}
}
HTML
ng-if='user.showAge'
Изменение: на самом деле, вы, вероятно, не захотите это делать в контроллере. Если вы это сделаете, он будет запускаться каждый раз, когда ваш контроллер загружается. Вам нужно только это, чтобы это произошло однажды. Чтобы знать, где это должно произойти, мне нужно будет увидеть больше кода, но я думаю, что это должно произойти, когда пользователь добавляется.
for
. Еще ng-repeat
? В любом случае, вы действительно не должны - иметь алгоритм O(n^2)
внутри ng-repeat
. Это было бы невероятно дорого. Подумайте об этом - каждый раз, когда есть цикл дайджеста, будет n ^ 2 итераций цикла!