Tengo un componente de superposición que aparece cuando un usuario hace clic en ciertas cosas en mi página, y en esta superposición da una advertencia y 2 botones, uno para sí y otro para no. Lo que quiero es crear una función que sirva a este componente, y luego esperará a que el usuario responda y, posteriormente, devolverá verdadero o falso según el botón que se presionó. Este resultado booleano se puede usar para seguir avanzando hacia otro código.
Esto es lo que he probado ya. Utiliza promesas en lugar de observables rxjs. Un componente llamará a esta función para traer la superposición del servicio, por ejemplo, this.service.promptUser().then(res => if (res === true) { doSomething() }) .
En el servicio:
didContinue: boolean = null; async promptUser() { this.showOverlay.next(true) //BehaviourSubject when true brings the popup await waitForUser(); const decision = this.didContinue; this.closeOverlay(); //sets didContinue back to null return decision } didContinue es una propiedad dentro del servicio para indicar si han hecho clic en sí o no usando un valor booleano. En caso contrario permanecerá nulo. Los eventos de clic del componente de superposición establecerán la propiedad didContinue en verdadero o falso.
La función waitForUser para esperar la entrada del usuario:
async waitForUser() { while (this.didContinue === null) {setTimeout(() => {}, 50}; } Actualmente se atascará en la función waitForUser() pero la ventana emergente no se habrá renderizado en esa etapa, por lo que el usuario no puede ingresar nada, la propiedad didContinue nunca cambiará y la aplicación se congelará.
Envíelo si conoce una solución existente, extraño muchas cosas con mi google-foo. Actualmente todavía soy nuevo en Angular.
Cree un servicio que manejará el resultado.
inyecte el servicio en su componente donde quiera usarlo así
constructor(public popService: popService) { } // crea funciones en consecuencia en el servicio
Llamar al método de servicio con la ayuda del constructor en un evento click() como este
<button (clic)="popService.success()">Listo
<button (click)="popService.cancel()">Listo, espero que esto ayude, avíseme si necesita más ayuda :-)