Aiuda - Pipes dinámicas en Angular2+

Nedaim

Estoy intentando hacer un componente que construya tablas de angular materials en base a un fichero de configuración.

Para el contenido de las celdas paso la configuración a un pipe custom que sabe como interpretarlo.

El problema viene cuando quiero que ese mismo pipe pase el contenido a otro pipe desde dentro. Para obtener el pipe de la celda dinamicamente hago esto:

constructor(private injector:Injector){}
.
.
.
 let pipe = this.injector.get(pipeName);
    return pipe.transform(row, pipeArgs);

Pero me dice que no existe provider para el pipeName que paso, da igual que use el nombre del pipe o el nombre de la clase del pipe.

Si pudieseis arrojar un poco de luz sobre que me falta lo agradecería. Ya he declarado los pipes que pueden ser usados en los providers del modulo.

Me explico como el culo, si necesitáis más información responderé cualquier pregunta.

Mortium

O esta mal importado, o llamas mal al pipe, una de dos

1 respuesta
Nedaim

#2 El pipe para el contenido funciona perfectamente para las demás responsabilidades que tiene con lo que entiendo que esta bien llamado.

He estado investigando y no parece que se pueda conseguir la instancia inyectable de un pipe por el nombre, la gente hace mapas { nombrepipe: instanciapipe, ...}. De momento voy a usar un enfoque parecido de crear otra instancia pero no me convence.

Zerokkk

¿Has metido la clase del Pipe en las declarations del NgModule en el que lo usas, o importado el módulo en el que lo declaras? Ese error me suena a que quizá te hayas olvidado de esa parte.

Asimismo, esto no lo tengo tan claro pero es posible que tengas que, además, declarar el pipe en entryComponents de ese módulo si quieres usarlo de esa forma. Esto sucede con los componentes cuando los quieres instanciar dinámicamente en un modal, y no sé si es aplicable a los pipes, pero si no te funciona lo que te dije primero, prueba esto segundo también (sería poner el pipe en "declarations" y "entryComponents" también).

1 respuesta
Nedaim

#4 Lo primero esta bien, probare lo segundo si lo que cuento a continuación me falla por algún lado.

He encontrado otra manera de hacerlo que debería mantener el comportamiento de función pura de pipe sin añadir instancias innecesarias. Os lo cuento por si le veis algún inconveniente.

He definido un pipe "functionPipe" al que se le pasa la fila de la tabla y una función. La función se define en el fichero de configuración para cada columna y el pipe llama a la función desde dentro de forma que solo existe una instancia de ese pipe y solo tengo que definir funciones en los archivos de configuración en vez de pipes completos.

Me ha parecido la mejor solución hasta ahora porque mantengo la configuración separada de la tabla abstracta (sin mapas de pipes a los que hubiese que añadir nuevos pipes), no tengo que crear archivos para pipes extras y mantengo el comportamiento puro de los pipes para no re-renderizar la tabla en cualquier cambio (o eso creo).

#4Zerokkk:

Esto sucede con los componentes cuando los quieres instanciar dinámicamente en un modal,

Esto me ha parecido interesante, nunca me he visto en un problema así. Te refieres a instanciar componentes con un innerHTML? Estas hablando de alguna libreria de modales en concreto?

W0rd

Sobre los modales y entryComponents suele pasar cuando se generan componentes en tiempo de ejecución, en tu caso nada que ver.

Sobre tu problema, intenta hacerlo lo mas simple posible, y si ves que la lógica crece tira a un método del componente. Piensa que son métodos estáticos en el sentido de ser totalmente independientes, puedes encadenar varias pipes.

ElCavernero

No entiendo por qué estás llamando al injector para llamar a la pipe despues, declara la pipe directamente en el constructor como si fuera un Service y listo:

constructor(private pipe: PipeClass){}

method(row: any){
 return this.pipe.transform(row, pipeArgs);
}

Usuarios habituales

  • ElCavernero
  • W0rd
  • Nedaim
  • Zerokkk
  • Mortium