Использование ng-параметров с различными объектами в AngularJS

0

У меня есть массив 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 или лучше для этого?

Теги:

2 ответа

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

В теории вы могли бы сделать что-то, если и в шаблоне, чтобы получить поля данных, чтобы они выглядели одинаково, например

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
});
  • 0
    Спасибо, я искал что-то вроде твоего уродливого метода. В моем случае это нормально, потому что степень не становится намного более сложной. Можете ли вы объяснить мне более точно, что вы делаете во втором варианте? Что это за map и keys ?
  • 0
    Оба являются частью vanilla js: Array.map() - это удобный способ генерации массива X на основе содержимого массива Y. (Вы можете использовать службу $filter angular, чтобы сделать более или менее одно и то же, если хотите, или просто написать простой старый цикл for..in и for..in возвращаемый массив вручную. Object.keys(foo) просто возвращает массив всех имен полей внутри foo (который я затем соединил в строку через .join(', ') используя .join(', ') .)
Показать ещё 1 комментарий
0

Одна вещь, которую вы можете сделать, это 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"

Ещё вопросы

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