Je souhaite ouvrir ou fermer des modaux à partir d'un autre module à l'aide du composant 1. Toutefois, je suis actuellement dans l'impossibilité d'accéder au modalRef de ngBootstrap des modaux de ce composant pour pouvoir le fermer/l'ouvrir.
Supposons que ce scénario
Un module
<component1></component1>
Another Module Ce module a plusieurs composants et chaque composant a un mode modal que je dois afficher ou masquer en fonction des conditions du composant 1.
<component2> //have ng bootstrap modal in it </component2>
<component3> //have ng bootstrap modal in it </component3>
<component4> //have ng bootstrap modal in it </component4>
<component5> //have ng bootstrap modal in it </component5>
<component6> //have ng bootstrap modal in it </component6>
Actuellement, je le fais en mettant simplement un bouton caché dans ce module et en cliquant dessus en utilisant le code JavaScript d'un autre composant. Je sais que ce n'est pas une bonne approche. Je souhaite que quelqu'un me donne une approche pour appeler ces modaux ou me dis s'il y a quelque chose à changer dans la conception.
Autant que je sache, je pense que le service sera utile pour le faire. Mais avant de changer le design, je veux l'opinion de quelqu'un. Merci
Créez un service avec Observable
et déclenchez et émettez quel utilisateur cliquez sur le bouton de fermeture.
Une fois le bouton de fermeture cliqué, l'événement peut être capturé dans n'importe quel autre composant et une action peut être effectuée.
Un service
@Injectable()
export class SomeService {
public popup: Subject<any> = new Subject<any>();
constructor() {}
}
Composant qui ont modal pour fermer.
constructor(SomeService: SomeService){
this.SomeService.popup.subscribe((val)=>{
if(val === 'close') {
// close the modal
}
});
}
Et maintenant, à partir de l'autre composant, vous pouvez déclencher l'événement pour fermer le modèle. vous pouvez effectuer la fermeture de n'importe quel composant.
constructor(private SomeService: SomeService) {}
SomeMethod() {
this.someService.popup.next('close');
}
Dans app.module.ts
:
{
...
imports [...],
entryComponents: [ModalComponent],
...
}
Ecrivez votre modèle dans le cadre "Composants en tant que contenu" de ici .
Dans le composant où vous utilisez le modal:
préférable mettre cela dans une méthode:
const modal = this.modalService.open(ModalComponent);
modal.componentInstance.title = "Dialog";
modal.componentInstance.body = "Your message";
Je viens juste de rencontrer le même problème et de trouver ce fil,Aniruddha Dasa fait un excellent travail en soulignant les exigences de base, mais j’ai trouvé qu’il manquait l’utilisation de TemplateRef qui est le prochain et juste au cas où quelqu'un d'autre aurait ce problème, je le finirai. en utilisant le même modèle que celui d'Aniruddha
Modèle:
<ng-template #updatemodal>
<div class="modal">
stuff here...
</div>
</ng-template>
Composant:
@ViewChild('updatemodal')
private modalRef: TemplateRef<any>;
private myModal<any>;
constructor(SomeService: SomeService, modalService: NgbModal){
this.SomeService.popup.subscribe((val)=>{
if(val === 'open') {
this.myModal = this.modalService.open(this.modalRef);
}
});
}
Référencer le modal qui a été créé est un excellent moyen de permettre davantage d’utilisation et de flexibilité dans la réponse en utilisant:
this.myModal.result.then((result) =>{
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
depuis le NgBootstrap site
Le problème est que la variable NgbModule
est disponible pour le module et non pour un autre module de votre application. Lorsque vous importez un module (ici NgbModule
), il est spécifique à ce module uniquement. Vous devez donc soit inclure NgbModule
dans l'autre module, soit l'exporter dans le module actuel et importer le module actuel dans l'autre module.
importer le dans l'autre module
@NgModule({
imports: [
NgbModule,
],
Ou importez le premier module de la seconde qui contenait déjà le module NgbModule
.