Угловое сравнение JS

0

У меня есть условие, которое необходимо проверить в моем представлении: если у любого пользователя в списке пользователей есть то же имя, что и у другого пользователя, я хочу показать их возраст.

Что-то вроде

<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>

за исключением того, что мне не хватает правильного условного

  • 0
    не могли бы вы подробнее рассказать об этом?
  • 0
    если какие-либо пользователи в списке пользователей имеют одинаковые имена, будет отображаться возраст (user.age). Еще возраст не будет показан
Показать ещё 1 комментарий
Теги:

2 ответа

0
Лучший ответ

Вы можете имитировать ключ/значение 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>
  • 0
    Это довольно запутанный объект карты и использование индекса нажатия. Можете ли вы подробнее рассказать об этом?
  • 0
    Это простой и эффективный способ обработки дубликатов элемента. Я нажимаю индекс, чтобы узнать, какой объект я должен изменить в массиве $scope.userList . Так что, если я получу ключ, и она тоже на карте, я нашел 2 идентичных имени, поэтому я нажму на индекс, где я смогу найти этот дубликат элемента. Ты понял ?
Показать ещё 1 комментарий
1

Вероятно, вы должны запустить некоторый код в контроллере, который добавляет флаг к объекту пользователя, чтобы указать, есть ли у него имя, которое используется другим пользователем.

Вы хотите свести к минимуму количество логики внутри 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'

Изменение: на самом деле, вы, вероятно, не захотите это делать в контроллере. Если вы это сделаете, он будет запускаться каждый раз, когда ваш контроллер загружается. Вам нужно только это, чтобы это произошло однажды. Чтобы знать, где это должно произойти, мне нужно будет увидеть больше кода, но я думаю, что это должно произойти, когда пользователь добавляется.

  • 0
    Могу ли я сделать это внутри HTML, используя $ index?
  • 0
    Я не уверен, как вы запустите внутренний цикл for . Еще ng-repeat ? В любом случае, вы действительно не должны - иметь алгоритм O(n^2) внутри ng-repeat . Это было бы невероятно дорого. Подумайте об этом - каждый раз, когда есть цикл дайджеста, будет n ^ 2 итераций цикла!
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню