Estou um pouco confuso sobre como obter o key
e value
de um objeto em angular2 durante a utilização *ngFor
para a iteração sobre o objeto. Eu sei que no 1.x angular existe uma sintaxe como
ng-repeat="(key, value) in demo"
mas eu não sei como fazer o mesmo em angular2. Eu tentei algo semelhante, sem sucesso:
<ul>
<li *ngFor='#key of demo'>{{key}}</li>
</ul>
demo = {
'key1': [{'key11':'value11'}, {'key12':'value12'}],
'key2': [{'key21':'value21'}, {'key22':'value22'}],
}
Aqui está um plnkr com a minha tentativa: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview
Como posso obter key1
e key2
usar dinamicamente *ngFor
? Depois de pesquisar bastante, achei a ideia de usar pipes, mas não sei como fazê-lo. Existe algum tubo embutido para fazer o mesmo em angular2?
angular
typescript
object
Pardeep Jain
fonte
fonte
key, value
par tipo de sintaxe no angular2ngFor
, você deve olhar para esta respostaPipe
para este ..Respostas:
Tenha
Object.keys
acessível no modelo e use-o no*ngFor
.fonte
*ngFor
s. Primeiros dois usandoobjectKeys
, o mais interno não é necessário (pois é apenas uma matriz).Como na versão mais recente do Angular (v6.1.0) , o Angular Team adicionou um novo pipe interno com o mesmo nome de
keyvalue
pipe para ajudá-lo a percorrer objetos, mapas e matrizes nocommon
módulo do pacote angular. Por exemplo -Exemplo bifurcado de trabalho
confira aqui para mais informações úteis -
Se você estiver usando o Angular v5 ou abaixo ou quiser usar o pipe, siga esta resposta
fonte
*ngFor="let item of testObject | keyvalue:keepOriginalOrder"
e em sua classe define:public keepOriginalOrder = (a, b) => a.key
Você pode criar um canal personalizado para retornar a lista de chaves para cada elemento. Algo parecido:
e use assim:
Editar
Você também pode retornar uma entrada contendo chave e valor:
e use assim:
fonte
keys.push({key: key, value: value[key]);
*ngFor
expressão. Ele cria um grande gargalo de desempenho, pois precisa gerar a coleção toda vez que o detector de alterações verifica alterações.pure:false
ao tubo, torna-se muito ineficiente. Você tem uma solução para atualizar o canal manualmente sempre que eu mudar o objeto (remover item)?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 )Atualizar
No 6.1.0-beta.1, KeyValuePipe foi introduzido https://github.com/angular/angular/pull/24319
Exemplo de Plunker
Versão anterior
Outra abordagem é criar uma
NgForIn
diretiva que será usada como:Exemplo de Plunker
ngforin.directive.ts
fonte
No Angular 6.1, você pode usar o pipe keyvalue :
Mas tem o inconveniente de classificar a lista resultante pelo valor da chave. Se você precisar de algo neutro:
Não se esqueça de especificar o atributo pure: false pipe. Nesse caso, o canal é chamado em cada ciclo de detecção de alterações, mesmo que a referência de entrada não tenha sido alterada (o mesmo ocorre quando você adiciona propriedades a um objeto).
fonte
Elaboração da resposta de @ Thierry com exemplo.
Não existe um método ou tubo embutido para obter
key and value
do loop * ngFor. então temos que criar um canal personalizado para o mesmo. Como Thierry disse, aqui está a resposta com o código.** A classe pipe implementa o método de transformação da interface PipeTransform, que pega um valor de entrada e uma matriz opcional de cadeias de parâmetros e retorna o valor transformado.
** O método de transformação é essencial para um tubo. A interface PipeTransform define esse método e guia as ferramentas e o compilador. É opcional; Angular procura e executa o método de transformação independentemente. para mais informações sobre tubos, consulte aqui
e parte HTML é:
Working Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview
atualizar para RC
como sugerido por user6123723 (obrigado) no comentário aqui é atualização.
fonte
A @Marton fez uma objeção importante à resposta aceita, alegando que o pipe cria uma nova coleção em cada detecção de alteração. Em vez disso, eu criaria um HtmlService que fornece uma variedade de funções utilitárias que o modo de exibição pode usar da seguinte maneira:
fonte
Object.keys(...)
dentro do * ngFor?TypeError: Cannot read property 'keys' of undefined
. Não parece ser suportado no modelo.template
opção, mas no código html real do modelo? obrigadoSe você já está usando o Lodash, pode fazer essa abordagem simples, que inclui chave e valor:
No arquivo datilografado, inclua:
e no componente exportado, inclua:
fonte
Obrigado pelo pipe, mas tive que fazer algumas alterações antes de poder usá-lo no angular 2 RC5. Alterou a linha de importação de tubulação e também adicionou um tipo de qualquer à inicialização da matriz de chaves.
fonte
Nenhuma das respostas aqui funcionou para mim imediatamente, eis o que funcionou para mim:
Crie
pipes/keys.ts
com o conteúdo:Adicione a
app.module.ts
(seu módulo principal):e adicione à matriz de declarações do módulo algo como isto:
Então, no seu modelo de exibição, você pode usar algo como isto:
Aqui está uma boa referência que encontrei se você quiser ler mais.
fonte
#
etc. btw sua resposta é também corrigir, sem dúvidaHá uma biblioteca muito legal que faz isso entre outros cachimbos. É chamado ngx-pipes .
Por exemplo, o tubo de chaves retorna chaves para um objeto e o tubo de valores retorna valores para um objeto:
tubo de chaves
tubo de valores
Não há necessidade de criar seu próprio tubo personalizado :)
fonte
Usar índice:
Uso:
fonte
Aqui está a solução simples
Você pode usar iteradores datilografados para isso
fonte
alterar o tipo de demonstração para matriz ou iterar sobre seu objeto e enviar para outra matriz
e do html:
fonte
Eu acho que Object.keys é a melhor solução para esse problema. Para qualquer um que se deparar com essa resposta e tentar descobrir por que Object.keys está dando a eles ['0', '1'] em vez de ['key1', 'key2'], uma história de advertência - tenha cuidado com a diferença entre " de "e" em ":
Eu já estava usando Object.keys, algo semelhante a este:
No entanto, em vez de
Eu escrevi inadvertidamente
que "funcionou" perfeitamente bem sem nenhum erro e retornou
Isso me custou cerca de 2 horas pesquisando e xingando ..
(bate na testa)
fonte
você pode obter a chave do objeto dinâmico tentando isso
fonte
Você tem que fazer isso assim por enquanto, eu sei que não é muito eficiente, pois você não deseja converter o objeto que recebe do firebase.
fonte