У меня есть массив things
с разными объектами в нем, например, 2 объекта differenz:
{name: 'book',
value: '5',
color: 'blue'}
а также
{name:'pen',
length: '10'}
Теперь я хочу показать все эти вещи в droplist, используя ng-options
. Поэтому я могу сделать:
ng-options="(thing.name + ', ' + thing.value + ', ' + thing.color)" for thing in things"
Если текущий объект - это book
, все будет хорошо, но если это pen
, я получаю беспорядок. Есть ли возможность различать объекты, которые я хочу показать в droplist или лучше для этого?
В теории вы могли бы сделать что-то, если и в шаблоне, чтобы получить поля данных, чтобы они выглядели одинаково, например
ng-options="(thing.name + ', ' + (thing.value? (thing.value + ", " + thing.color): (thing.length))" for thing in things"
... но это уродливо, как грех, и будет трудно поддерживать, особенно если у вас есть больше, чем эти два нерегулярных типа объектов в вашем массиве things
. Вероятно, вам лучше массировать данные заблаговременно в функции директивной ссылки для создания чистого массива, содержащего строки параметров, которые вы хотите встроить.
Например, если все, что вы ищете, представляет собой список полей, разделенных запятыми, в каждой "вещи":
scope.myCleanOptions = things.map(function(thing) {
return Object.keys(thing).join(", "); // or whatever
});
Одна вещь, которую вы можете сделать, это copy
и extend
ваши объекты, в новую.
Итак, что-то вроде:
var mergedObj = angular.copy(bookThing);//clone bookThing into mergedObj angular.extend(mergedObj, penThing);//extend mergedObj with the contents of penThing
И теперь используйте mergedObj для раскрывающегося списка. Возможно, вам понадобится использовать track
в своих ng-options
чтобы указать, какое свойство является вашим ключом.
Итак, что-то вроде:
ng-options="item.name for item in mergedObj track by item.name"
map
иkeys
?Array.map()
- это удобный способ генерации массива X на основе содержимого массива Y. (Вы можете использовать службу$filter
angular, чтобы сделать более или менее одно и то же, если хотите, или просто написать простой старый циклfor..in
иfor..in
возвращаемый массив вручную.Object.keys(foo)
просто возвращает массив всех имен полей внутри foo (который я затем соединил в строку через.join(', ')
используя.join(', ')
.)