Я немного озадачен тем, как получить key
и value
объекта в angular2 при использовании *ngFor
для перебора объекта. Я знаю в angular 1.x есть синтаксис вроде
ng-repeat="(key, value) in demo"
но я не знаю, как сделать то же самое в angular2. Я пробовал что-то подобное, но безуспешно
<ul>
<li *ngFor='#key of demo'>{{key}}</li>
</ul>
demo = {
'key1': [{'key11':'value11'}, {'key12':'value12'}],
'key2': [{'key21':'value21'}, {'key22':'value22'}],
}
Вот plnkr с моей попыткой: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview
Как я могу получить key1
и key2
динамически использовать *ngFor
? После тщательного поиска я нашел идею использования каналов, но я не знаю, как это сделать. Есть ли встроенная труба для того же в angular2?
angular
typescript
object
Пардип Джейн
источник
источник
key, value
в angular2 нет синтаксиса парной поддержкиngFor
, вы должны посмотреть на этот ответPipe
для этого ..Ответы:
Иметь
Object.keys
доступ в шаблоне и использовать его в*ngFor
.источник
*ngFor
с. Первые два, используяobjectKeys
, внутренне не нужно (так как это просто массив).Как и в последнем выпуске Angular (v6.1.0) , Angular Team добавила новый встроенный канал для канала с тем же именем, что и
keyvalue
канал, чтобы помочь вам перебирать объекты, карты и массивы вcommon
модуле углового пакета. Например -Рабочий разветвленный пример
проверьте это здесь для более полезной информации -
Если вы используете Angular v5 или ниже или хотите добиться использования pipe, следуйте этому ответу
источник
*ngFor="let item of testObject | keyvalue:keepOriginalOrder"
и в своем классе определите:public keepOriginalOrder = (a, b) => a.key
Вы можете создать пользовательский канал для возврата списка ключей для каждого элемента. Что-то такое:
и используйте это так:
редактировать
Вы также можете вернуть запись, содержащую ключ и значение:
и используйте это так:
источник
keys.push({key: key, value: value[key]);
*ngFor
выражения. Это создает огромное узкое место в производительности, потому что оно должно генерировать коллекцию каждый раз, когда детектор изменений проверяет наличие изменений.pure:false
в трубу, она станет очень неэффективной. Есть ли у вас решение обновить канал вручную, когда я меняю объект (удаляю элемент)?common: NgFor has been removed as it was deprecated since v4. Use NgForOf instead. This does not impact the use of*ngFor in your templates.
( jaxenter.com/road-to-angular-5-133253.html )Обновить
В 6.1.0-beta.1 KeyValuePipe был введен https://github.com/angular/angular/pull/24319
Пример плунжера
Предыдущая версия
Другой подход заключается в создании
NgForIn
директивы, которая будет использоваться следующим образом:Пример плунжера
ngforin.directive.ts
источник
Из Angular 6.1 вы можете использовать keyvalue pipe:
Но есть неудобство, которое сортирует результирующий список по значению ключа. Если вам нужно что-то нейтральное:
Не забудьте указать атрибут pure: false pipe. В этом случае канал вызывается при каждом цикле обнаружения изменений, даже если входная ссылка не изменилась (как в случае добавления свойств к объекту).
источник
Разработка ответа @ Тьерри с примером.
В
key and value
цикле * ngFor нет встроенного канала или метода . поэтому мы должны создать собственную трубу для того же самого. как сказал тьерри, вот ответ с кодом.** Класс pipe реализует метод преобразования интерфейса PipeTransform, который принимает входное значение и необязательный массив строк параметров и возвращает преобразованное значение.
** Метод преобразования имеет важное значение для трубы. Интерфейс PipeTransform определяет этот метод и управляет как инструментами, так и компилятором. Это необязательно; Angular ищет и выполняет метод преобразования независимо. для более подробной информации смотрите здесь
а HTML часть это:
Рабочая Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview
обновить до RC
как предложено user6123723 (спасибо) в комментарии здесь обновление.
источник
У @Marton было важное возражение против принятого ответа на том основании, что канал создает новую коллекцию при каждом обнаружении изменений. Вместо этого я бы создал HtmlService, который предоставляет ряд служебных функций, которые представление может использовать следующим образом:
источник
Object.keys(...)
внутри * ngFor?TypeError: Cannot read property 'keys' of undefined
. Кажется, он не поддерживается в шаблоне.template
опции, а в фактическом HTML-коде шаблона? спасибоЕсли вы уже используете Lodash, вы можете использовать этот простой подход, который включает в себя как ключ, так и значение:
В файле машинописи включите:
и в экспортируемый компонент, включают:
источник
Спасибо за трубу, но мне пришлось внести некоторые изменения, прежде чем я смог использовать ее в угловых 2 RC5. Изменена строка импорта Pipe, а также добавлен тип any в инициализацию массива ключей.
источник
Ни один из ответов здесь не работал для меня из коробки, вот что сработало для меня:
Создать
pipes/keys.ts
с содержанием:Добавить в
app.module.ts
(Ваш основной модуль):и затем добавьте в ваш массив объявлений модуля что-то вроде этого:
Тогда в вашем шаблоне представления вы можете использовать что-то вроде этого:
Вот хорошая ссылка, которую я нашел, если вы хотите узнать больше.
источник
#
и т. д. Кстати, ваш ответ также верен, без сомненияЕсть действительно хорошая библиотека, которая делает это среди других хороших каналов. Это называется ngx-pipe .
Например, pipe pipe возвращает ключи для объекта, а pipe values возвращает значения для объекта:
ключи трубы
труба ценностей
Не нужно создавать свои собственные трубы :)
источник
Используйте индекс:
Применение:
источник
Вот простое решение
Вы можете использовать итераторы машинописи для этого
источник
измените демонстрационный тип на массив или переберите свой объект и нажмите на другой массив
и из HTML:
источник
Я думаю, что Object.keys - лучшее решение этой проблемы. Для любого, кто сталкивается с этим ответом и пытается выяснить, почему Object.keys дает им ['0', '1'] вместо ['key1', 'key2'], предостерегающую историю - остерегайтесь разницы между " из "и" в ":
Я уже использовал Object.keys, что-то похожее на это:
Однако вместо
Я случайно написал
который "работал" совершенно нормально без каких-либо ошибок и вернулся
Это стоило мне около 2 часов, гуглил и ругался ..
(шлепает по лбу)
источник
Вы можете получить ключ динамического объекта с помощью этого
источник
Вы должны сделать это сейчас, я знаю, что это не очень эффективно, так как вы не хотите конвертировать объект, который вы получаете от Firebase.
источник