Estoy tratando de configurar un sistema de pestañas que permita que los componentes se registren solos (con un título). La primera pestaña es como una bandeja de entrada, hay muchas acciones / elementos de enlace para elegir para los usuarios, y cada uno de estos clics debería ser capaz de instanciar un nuevo componente, al hacer clic. Las acciones / enlaces vienen de JSON.
El componente instanciado se registrará como una nueva pestaña.
No estoy seguro de si este es el "mejor" enfoque? Hasta ahora, las únicas guías que he visto son para pestañas estáticas, lo que no ayuda.
Hasta ahora, solo tengo el servicio de pestañas, que está inicializado en main para persistir en toda la aplicación. Se parece a esto:
export interface ITab { title: string; }
@Injectable()
export class TabsService {
private tabs = new Set<ITab>();
addTab(title: string): ITab {
let tab: ITab = { title };
this.tabs.add(tab);
return tab;
}
removeTab(tab: ITab) {
this.tabs.delete(tab);
}
}
Preguntas:
- ¿Cómo puedo tener una lista dinámica en la bandeja de entrada que crea pestañas nuevas (diferentes)? ¿Estoy adivinando
DynamicComponentBuilder
que se usaría? - ¿Cómo se pueden crear los componentes desde la bandeja de entrada (al hacer clic) registrarse como pestañas y también mostrarse? Supongo
ng-content
, pero no puedo encontrar mucha información sobre cómo usarlo
EDITAR: un intento de aclarar.
Piense en la bandeja de entrada como una bandeja de entrada de correo. Los elementos se obtienen como JSON y muestra varios elementos. Una vez que se hace clic en uno de los elementos, se crea una nueva pestaña con ese tipo de acción de elementos. El tipo es entonces un componente.
EDITAR 2: Imagen .
Respuestas:
actualizar
Angular 5 StackBlitz ejemplo
actualizar
ngComponentOutlet
fue agregado a 4.0.0-beta.3actualizar
Hay un
NgComponentOutlet
trabajo en progreso que hace algo similar https://github.com/angular/angular/pull/11235RC.7
Ejemplo de Plunker RC.7
Ejemplo de uso
Ver también angular.io CARGADOR DE COMPONENTES DINÁMICO
versiones anteriores xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Esto cambió nuevamente en Angular2 RC.5
Actualizaré el ejemplo a continuación, pero es el último día antes de las vacaciones.
Este ejemplo de Plunker muestra cómo crear dinámicamente componentes en RC.5
Actualización: use ViewContainerRef .createComponent ()
Debido a que
DynamicComponentLoader
está en desuso, el enfoque debe actualizarse nuevamente.Ejemplo de Plunker
RC.4 Ejemplo de Plunker beta.17
Actualización: use loadNextToLocation
Ejemplo de Plunker beta.17
original
No estoy del todo seguro de su pregunta cuáles son sus requisitos, pero creo que esto debería hacer lo que desea.
El
Tabs
componente obtiene una matriz de tipos pasados y crea "pestañas" para cada elemento de la matriz.Ejemplo de Plunker beta.15 (no basado en su Plunker)
También hay una manera de pasar datos que pueden pasarse al componente creado dinámicamente como (
someData
necesitaría pasarse comotype
)También hay algún soporte para usar la inyección de dependencia con servicios compartidos.
Para más detalles ver https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html
fuente
DclWrapper
para que cree una instancia real.ViewContainerRef
lugar de usarViewChild
, luego<dcl-wrapper>
se convierte en el objetivo. Los elementos se agregan como hermanos del objetivo y, por lo tanto, estarán fuera de<dcl-wrapper>
esta manera.''
(cadena vacía) `y cambiar el constructor aconstructor(private target:ViewContainerRef) {}
, luego los componentes agregados dinámicamente se convierten en hermanos de<dcl-wrapper>
No soy lo suficientemente bueno para los comentarios. Arreglé el plunker de la respuesta aceptada para trabajar para rc2. Nada de lujos, los enlaces a la CDN se rompieron, eso es todo.
https://plnkr.co/edit/kVJvI1vkzrLZJeRFsZuv?p=preview
fuente
hay componentes listos para usar (compatibles con rc5) ng2-steps que se usan
Compiler
para inyectar componentes en el contenedor de pasos y el servicio para conectar todo (sincronización de datos)fuente