У меня есть массив объектов, используемых в 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>
Это работает - флажок отображается в соответствующих элементах, но остальная часть объекта объекта полностью переопределяется.
Почему это происходит?
Как я могу убедиться, что когда я нажимаю новый объект, исходный объект остается неповрежденным?
Я, вероятно, захочу нажать новое поле, а не объект, но было бы неплохо узнать об обоих.
Кроме того, есть ли лучший способ достичь таких результатов с чистым угловым? Я уверен, что есть некоторые хорошие методы lodash для такого рода вещей, но я не хочу вводить lodash прямо сейчас.
В настоящее время вы добавляете новый элемент без названия или имени пользователя в список всякий раз, когда встречается совпадение. Я не знаю, является ли это намеренным, но вы, вероятно, просто хотите установить свойство 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);
Вот обновленная версия вашей скрипки.