plunker preview
У меня есть основной массив с информацией о пользователях.
Каждый элемент (пользователь) имеет массив 'данные':
{
name: 'Linda',
data: [
{
value: 3
},
{
value: 6
}
]
}
Мне нужно напечатать основной массив так:
- Linda - 3
- Линда - 6
ОБНОВЛЕНО: И я могу изменить имена в входах. См. Версию 2.
Поэтому я использую ng-repeat с функцией, которая возвращает новый объект. И я получаю известную ошибку: [$ rootScope: infdig]
Чтобы избежать этой ошибки я использую google groups подход: «изменить» фильтр и «линкер» завод.
(Я хотел использовать метод $$ hashKey, но я не понимал, как это сделать)
Чтобы получить эту ошибку, откройте мой код и удалите фильтр «изменить» в HTML.
Вопрос: возможно, вы знаете, как проще решить печатный массив? Благодарю.
И если я буду сортировать до печати?
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.users = [
{
name: 'Linda',
data: [
{
value: 3
},
{
value: 6
}
]
},
{
name: 'John',
data: [
{
value: 2
},
{
value: 11
}
]
}
];
$scope.getUsersData = function(){
var output = [];
$scope.users.forEach(function(user){
if ('data' in user) {
user.data.forEach(function(userData){
output.push({name: user.name, value: userData.value});
});
}
});
return output;
};
});
// From https://groups.google.com/d/msg/angular/IEIQok-YkpU/iDw32-YRr3QJ
app.filter('change', function(linker) {
return function(items) {
var collection = items.map(function (item) {
return item;
});
return linker(collection, 'some-key');
};
});
app.factory('linker', function() {
var links = {};
return function (arr, key) {
var link = links[key] || [];
arr.forEach(function (newItem, index) {
var oldItem = link[index];
if (!angular.equals(oldItem, newItem))
link[index] = newItem;
});
link.length = arr.length;
return links[key] = link;
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<body ng-app="plunker" ng-controller="MainCtrl as main">
<ul>
<li ng-repeat="user in users = getUsersData() | change track by $index">{{user.name}} - {{user.value}}</li>
</ul>
<hr>
<div ng-repeat="user in users">
<input ng-model="user.name"/>
</div>
</body>
вы не можете использовать функцию в ngRepeat, как это. – MMK