Перебирать вложенные объекты - если поле соответствует переменной, обновите $ scope

0

У меня есть массив объектов, используемых в ng-repeat. Каждый объект будет иметь массив вложенных объектов с одним полем. Пример:

{
  "_id": "55927dc3d2d258ac62fcdb36",
  "title": "Some title",
  "username": "test1",
  "voted": [
    {
      "username": "bill" 
    },
    {
      "username": "ben" 
    },
    {
      "username": "sarah" 
    }
  ]
},
{ 
  "_id": "55927dc3d2d258ac62fcdabc",
  "title": "Another title",
  "voted": [
    {
      "username": "someone" 
    }
  ]
},
{ 
  "_id": "55927dc3d2d258ac62fcddef",
  "title": "Something else",
  "voted": []
}

Для каждого объекта я хотел бы проверить, имеет ли один из вложенных объектов в voted массиве значение, которое полностью соответствует переменной вне массива. Если совпадение найдено, я хочу направить новое поле на объект (за пределами voted массива), чтобы пользователь мог отобразить "флаг".

У меня есть пример "работа", но не так, как я хочу. Я итерацию по каждому пункту с angular.forEach, а затем перебрать voted, и проверить, если какой - либо из voted.username полей соответствуют $scope.randomNameExample. Если совпадение найдено, я нажимаю новый объект в значение $scope.items:

$scope.randomNameExample = 'bill';

var items = [
  { ... },
  { ... },
  { ... },
  { ... }
];

$scope.items = items;

angular.forEach(items, function(item) {

  angular.forEach(item.voted, function(voted) {

        if(voted.username === $scope.randomNameExample) {
          console.log("username is the same - push $scope!");
          var matchingUsernamesObj = {matchingUsernames: true};

          $scope.items.push(matchingUsernamesObj);
          console.log(this);

        }

  }, $scope.items);

}, $scope.items);

Шаблон:

<li ng-repeat="item in items">
    <p>{{item.title}}</p>
    <p>by {{item.username}}</p>

    <!-- if item.voted[X].username matches randomNameExample, show this element -->

    <p ng-show="item.matchingUsernames" class="its-happened">already voted.</p>

</li>

Это работает - флажок отображается в соответствующих элементах, но остальная часть объекта объекта полностью переопределяется.

Почему это происходит?

Как я могу убедиться, что когда я нажимаю новый объект, исходный объект остается неповрежденным?

Я, вероятно, захочу нажать новое поле, а не объект, но было бы неплохо узнать об обоих.

JSFiddle

Кроме того, есть ли лучший способ достичь таких результатов с чистым угловым? Я уверен, что есть некоторые хорошие методы lodash для такого рода вещей, но я не хочу вводить lodash прямо сейчас.

Теги:
angularjs-ng-repeat

1 ответ

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

В настоящее время вы добавляете новый элемент без названия или имени пользователя в список всякий раз, когда встречается совпадение. Я не знаю, является ли это намеренным, но вы, вероятно, просто хотите установить свойство matchingUsernames на item который имел совпадение.

angular.forEach(items, function(item) {

  angular.forEach(item.voted, function(voted) {

        if(voted.username === $scope.randomNameExample) {
          item.matchingUsernames = true;
        }

  }, $scope.items);

}, $scope.items);

Вот обновленная версия вашей скрипки.

  • 0
    Большое спасибо! Это намного лучше и проясняет некоторые вещи в голове ... Я думаю, что я немного запутался после некоторого поиска. :-)

Ещё вопросы

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