Estoy un poco confundido acerca de cómo obtener el key
y value
de un objeto en angular2 mientras lo uso *ngFor
para iterar sobre el objeto. Sé que en angular 1.x hay una sintaxis como
ng-repeat="(key, value) in demo"
pero no sé cómo hacer lo mismo en angular2. He intentado algo similar, sin éxito:
<ul>
<li *ngFor='#key of demo'>{{key}}</li>
</ul>
demo = {
'key1': [{'key11':'value11'}, {'key12':'value12'}],
'key2': [{'key21':'value21'}, {'key22':'value22'}],
}
Aquí hay un plnkr con mi intento: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview
¿Cómo puedo obtener key1
y key2
usar dinámicamente *ngFor
? Después de buscar mucho, encontré la idea de usar tuberías, pero no sé cómo hacerlo. ¿Hay alguna tubería incorporada para hacer lo mismo en angular2?
angular
typescript
object
Pardeep Jain
fuente
fuente
key, value
tipo de sintaxis de par de soporte en angular2ngFor
, debería ver esta respuestaPipe
Respuestas:
Tener
Object.keys
accesible en la plantilla y usarla en*ngFor
.fuente
*ngFor
s. Primeros dos usandoobjectKeys
, lo más interno no es necesario (ya que es solo una matriz).Al igual que en la última versión de Angular (v6.1.0) , Angular Team ha agregado una nueva tubería integrada para el mismo nombre que la
keyvalue
tubería para ayudarlo a recorrer objetos, mapas y matrices en elcommon
módulo del paquete angular. Por ejemplo -Ejemplo de trabajo bifurcado
échale un vistazo aquí para obtener más información útil:
Si está utilizando Angular v5 o inferior o desea lograr el uso de tubería, siga esta respuesta
fuente
*ngFor="let item of testObject | keyvalue:keepOriginalOrder"
y en su clase defina:public keepOriginalOrder = (a, b) => a.key
Puede crear una tubería personalizada para devolver la lista de claves para cada elemento. Algo como eso:
y úsalo así:
Editar
También puede devolver una entrada que contenga clave y valor:
y úsalo así:
fuente
keys.push({key: key, value: value[key]);
*ngFor
expresión. Crea un enorme cuello de botella de rendimiento porque necesita generar la colección cada vez que el detector de cambios comprueba los cambios.pure:false
a la tubería, se vuelve muy ineficiente. ¿Tiene una solución para actualizar la tubería manualmente cada vez que cambio el objeto (eliminar elemento)?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 )Actualizar
En 6.1.0- beta.1 se introdujo KeyValuePipe https://github.com/angular/angular/pull/24319
Ejemplo de Plunker
Versión previa
Otro enfoque es crear
NgForIn
directivas que se utilizarán como:Ejemplo de Plunker
ngforin.directive.ts
fuente
Desde Angular 6.1 puede usar la tubería keyvalue :
Pero tiene el inconveniente de que ordena la lista resultante por el valor clave. Si necesitas algo neutral:
No olvide especificar el atributo pure: false pipe. En este caso, la tubería se invoca en cada ciclo de detección de cambio, incluso si la referencia de entrada no ha cambiado (así es el caso cuando agrega propiedades a un objeto).
fuente
Elaboración de la respuesta de @ Thierry con ejemplo.
No hay una tubería o método incorporado para obtener
key and value
del bucle * ngFor. así que tenemos que crear una tubería personalizada para lo mismo. Como dijo Thierry, aquí está la respuesta con el código.** La clase pipe implementa el método de transformación de la interfaz PipeTransform que toma un valor de entrada y una matriz opcional de cadenas de parámetros y devuelve el valor transformado.
** El método de transformación es esencial para una tubería. La interfaz PipeTransform define ese método y guía tanto las herramientas como el compilador. Es opcional; Angular busca y ejecuta el método de transformación independientemente. para más información sobre tuberías consulte aquí
y la parte HTML es:
Working Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview
actualizar a RC
según lo sugerido por user6123723 (gracias) en el comentario aquí está la actualización.
fuente
@ Martin tuvo una importante objeción a la respuesta aceptada debido a que la tubería crea una nueva colección en cada detección de cambio. En su lugar, crearía un HtmlService que proporciona una gama de funciones de utilidad que la vista puede usar de la siguiente manera:
fuente
Object.keys(...)
dentro de * ngFor?TypeError: Cannot read property 'keys' of undefined
. No parece ser compatible con la plantilla.template
opción, sino en el código html real de la plantilla? graciasSi ya está usando Lodash, puede hacer este enfoque simple que incluye clave y valor:
En el archivo mecanografiado, incluya:
y en el componente exportado, incluya:
fuente
Gracias por la tubería, pero tuve que hacer algunos cambios antes de poder usarla en angular 2 RC5. Cambió la línea de importación de Pipe y también agregó el tipo de any a la inicialización del conjunto de claves
fuente
Ninguna de las respuestas aquí funcionó para mí fuera de la caja, esto es lo que funcionó para mí:
Crear
pipes/keys.ts
con contenidos:Agregar a
app.module.ts
(Su módulo principal):y luego agregue al conjunto de declaraciones de su módulo algo como esto:
Luego, en su plantilla de vista, puede usar algo como esto:
Aquí hay una buena referencia que encontré si quieres leer más.
fuente
#
cierto, su respuesta también es correcta, sin dudaHay una biblioteca realmente agradable que hace esto entre otras buenas tuberías. Se llama ngx-pipes .
Por ejemplo, la canalización de claves devuelve claves para un objeto, y la canalización de valores devuelve valores para un objeto:
tubo de llaves
tubería de valores
No es necesario crear su propia tubería personalizada :)
fuente
Índice de uso:
Uso:
fuente
Aquí está la solución simple
Puede usar iteradores de mecanografía para esto
fuente
cambiar el tipo de demostración a matriz o iterar sobre su objeto y pasar a otra matriz
y de html:
fuente
Creo que Object.keys es la mejor solución para este problema. Para cualquiera que encuentre esta respuesta y esté tratando de descubrir por qué Object.keys les está dando ['0', '1'] en lugar de ['clave1', 'clave2'], una historia de advertencia: tenga cuidado con la diferencia entre " de "y" en ":
Ya estaba usando Object.keys, algo similar a esto:
Sin embargo, en lugar de
Inadvertidamente escribí
que "funcionó" perfectamente bien sin ningún error y regresó
Eso me costó unas 2 horas buscando en Google y maldiciendo ...
(golpea la frente)
fuente
puede obtener la clave del objeto dinámico al intentar esto
fuente
Tienes que hacerlo así por ahora, sé que no es muy eficiente, ya que no quieres convertir el objeto que recibes de Firebase.
fuente