Cette réponse est basée sur le exemple de stackblitz prévue dans le présent réponse à une question similaire que j'ai posée.
Étape 1 : Créez une directive que vous utiliserez partout où vous voulez avoir votre composant réutilisable.
@Directive({
selector: '[reusable-outlet]',
})
export class ReusableDirective implements OnInit {
constructor(
private viewContainerRef: ViewContainerRef,
private reusableService: ReusableService
) { }
public ngOnInit(): void {
this.reusableService.attach(this.viewContainerRef);
}
}
Étape 2 Créez le service qui sera en charge de :
- créer dynamiquement le composant qui sera réutilisé
- attacher et détacher ce composant au conteneur de vue de la directive créée à l'étape ~1.
Remarque : Savoir quand détacher le composant est basé sur les événements du routeur, mais il devrait être possible de le baser sur des messages à la place, si vous avez besoin de changer l'emplacement de votre composant sans avoir à modifier la navigation.
@Injectable()
export class ReusableService {
private componentRef: ComponentRef<ReusableComponent>;
private currentViewContainerRef: ViewContainerRef;
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
private injector: Injector,
private router: Router
) {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ReusableComponent);
this.componentRef = componentFactory.create(injector);
this.router.events.subscribe(event => {
if (event instanceof NavigationStart && this.currentViewContainerRef) {
this.detach(this.currentViewContainerRef);
}
});
}
public attach(viewContainerRef: ViewContainerRef) {
this.currentViewContainerRef = viewContainerRef;
viewContainerRef.insert(this.componentRef.hostView);
}
public detach(viewContainerRef: ViewContainerRef) {
viewContainerRef.detach(viewContainerRef.indexOf(this.componentRef.hostView));
}
}
2 votes
Si je comprends bien, vous voulez faire de votre
AppMyComponent
asingleton
? Tout d'abord, je ne pense pas qu'il y ait un moyen de faire en sorte que lescomponent class singleton
et deuxièmement, pourquoi avez-vous besoin de cela ? En général, nous faisons uneservice singleton
1 votes
Peut-être qu'un exemple plus concret de ce que vous voulez faire serait utile, car dans cet exemple de code, vous affichez la même chose dans chaque condition, donc je m'interroge sur la nécessité de la condition.
0 votes
Si vous souhaitez modifier quelque chose dans l'app-mycomponent lorsque quelque chose a changé dans le composant parent, vous pouvez le faire en utilisant @Input avec des setters - comme indiqué ici -. angular.io/guide/
0 votes
Merci de votre intérêt. Je ne demande pas s'il est possible de faire un singleton. Je demande si je peux utiliser la même instance en la stockant par exemple dans un service ou autre. et bien sûr, cela n'a aucun sens. mon exemple réel est trop complexe pour que quelqu'un puisse y répondre. mon besoin est très simple : afficher un composant de carte à différents endroits en fonction des conditions. c'est l'exemple le plus basique du cas, même s'il n'a aucun sens dans le monde réel.
1 votes
J'ai eu un problème similaire, je ne voulais pas détruire ma carte lorsque je changeais d'itinéraire. Jetez un coup d'œil ici stackoverflow.com/a/49759253/1160794
0 votes
@David : Merci ! Je vais me pencher sur la question immédiatement.
1 votes
Si cela ne vous dérange pas de lire un peu de code, je dirais que l'implémentation de
MatDialog
dans Angular Material est une très bonne démonstration de la façon de construire un composant dans un service et de le montrer ensuite dans différents endroits de l'application.0 votes
Merci pour le conseil Thor ! J'essaierai de faire des recherches si cette prime n'aboutit pas à une bonne réponse.
0 votes
Vous pouvez utiliser une classe enveloppante pour utiliser la même instance d'un composant tel que cette .
0 votes
@charm Je dirais plutôt de sauvegarder l'état de votre composant et de le rendre si léger que toutes les instances du composant peuvent se référer au même état et lorsque vous mettez à jour l'état, il sera immédiatement reflété dans tous les composants.
1 votes
Que voulez-vous dire quand vous dites que l'exemple de stackblitz ne fonctionne plus ? Je viens de l'essayer et il fonctionne toujours.
0 votes
Désolé @David. J'utilise parfois stackoverflow avec Edge et naturellement cela n'a pas fonctionné. C'est exactement ce dont j'avais besoin, alors écrivez une réponse courte si vous le voulez bien et je l'accepterai (et j'accorderai une prime).
0 votes
@DipenShah : c'est naturellement ma première option. j'utilise redux pour maintenir l'état donc c'est facile à faire. de toute façon j'ai besoin de savoir comment cela peut être fait pour pouvoir évaluer la voie à suivre.
0 votes
Utilisation de [style.display]="isVisible?'none':'inline-block'" ?
0 votes
Veuillez supprimer la deuxième modification du message de la question et rédiger un message de réponse.