Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

120
Visualizações
Suscríbase al resultado del mapa asíncrono observable con la entrada del cuadro de diálogo, use el resultado del mapa para enrutar

Estoy llamando a un servicio API que devuelve un Observable, que contiene una matriz de elementos.

apiMethod(input: Input): Observable<ResultElement[]>

A partir de esto, he estado eligiendo el primer elemento de la matriz, suscribiéndome a eso. Luego usó ese elemento para enrutar a otra página como esta:

 this.apiService .apiMethod(input) .pipe(map((results) => results[0]) .subscribe( (result) => { return this.router.navigate('elements/', result.id) } )

Esto funciona bien.

El problema es que no quiero usar solo el primer elemento, quiero que aparezca un MatDialog u otro similar, y darle al usuario la opción de qué elemento elegir, y LUEGO enrutar al correcto.

Sin embargo, si la lista solo contiene un elemento, el cuadro de diálogo no debería mostrarse y el usuario debería ser enrutado inmediatamente.

Intenté abrir un cuadro de diálogo en la .pipe(map()) , pero la subscribe() ocurre antes de que obtenga una respuesta del usuario, lo que hace que falle. Y no estoy seguro de si ese es el enfoque correcto. ¿Cómo resolvería alguno de ustedes este problema?

Editar Terminó haciendo en parte lo que sugirió @BizzyBob:

Cambiando el mapa a switchmap en la llamada API, haciéndolo de esta manera:

 this.apiService .apiMethod(input) .pipe(switchMap((results) => this.mapToSingle(results) .subscribe( (result) => { return this.router.navigate('elements/', result.id) } )

Con mapToSingle(ResultElement[]) siendo así:

 private mapToSingle(results: ResultElement[]): Observable<ResultElement> { if (result.length === 1){ return of(results[0]); } const dialogConfig = new MatDialogConfig<ResultElement[]>(); dialogConfig.data = results; const dialogRef = this.dialog.open(ResultDialogComponent, dialogConfig); return dialogRef.afterClosed(); }
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Dos opciones posibles:

  1. Tener un tema para el resultado seleccionado que es "siguiente" ya sea por la entrada del usuario o un efecto secundario de obtener un resultado de API con un elemento.
  2. Hacer un seguimiento de un estado general del componente y responder adecuadamente cada vez que se establece un resultado seleccionado en el estado.

El siguiente ejemplo es un boceto del uso de un Observable para realizar un seguimiento del estado del componente.

  • Hay dos flujos de entrada en el estado, los resultados de la API y la entrada del usuario para el resultado seleccionado.
  • Cada flujo se convierte en una función reductora que modificará el estado general.
  • La interfaz de usuario debe suscribirse a este estado a través de una canalización asíncrona, mostrando el modal cuando corresponda y actualizando el estado de actualización de los eventos a través de los Sujetos.
  • La redirección debería ser un efecto del cambio de estado cuando el resultado seleccionado tiene un valor.
 readonly getResultsSubject = new Subject<MyInput>(); readonly resultSelectedSubject = new Subject<ResultType>(); private readonly apiResults$ = this.getResultsSubjects.pipe( switchMap((input) => this.apiMethod(input)) ); readonly state = combineLatest([ this.apiResults$.pipe(map(results => (s) => results.length === 1 ? { ...s, results, selectedResult: x[0], showModal: false } : { ...s, results, showModal: results.length > 1 })), this.resultSelectedSubject.pipe(map(selectedResult => (s) => ({ ...s, selectedResult }))) ]).pipe( scan((s, reducer) => reducer(s), { }), shareReplay(1) ); ngOnInit() { this.state.pipe( filter(x => !!x.selectedResult) ).subscribe(x => this.router.navigate('elements/', x.selectedResult.id)); }

Últimamente estoy usando mucho este patrón. Hace que sea bastante fácil que crezca el número de acciones y propiedades del estado.

about 4 years ago · Juan Pablo Isaza Relatório

0

Crearía un DialogComponent que tome la lista de opciones como entrada y emita el elemento elegido cuando esté cerrado.

Luego, cree un método auxiliar ( quizás promptUser ) que simplemente devuelva un observable que emita el valor seleccionado:

 this.apiService.apiMethod(input) .pipe( switchMap(results => results.length > 1 ? this.promptUser(results) : of(results[0]) ) ) .subscribe( result => this.router.navigate('elements/', result.id) );

Aquí simplemente usamos switchMap para devolver un observable que emita el elemento adecuado. Si la longitud es mayor que 1, devolvemos el método auxiliar que muestra el cuadro de diálogo y emite el elemento elegido; de lo contrario, solo emitimos el primer ( único ) elemento. Tenga en cuenta que envolvimos el valor simple con of ya que dentro de switchMap, necesitamos devolver observable.

En cualquier caso, el elemento deseado es emitido y recibido por su devolución de llamada de suscripción.

about 4 years ago · Juan Pablo Isaza Relatório

0

Lo resolvería usando el siguiente método:

  1. Obtenga los datos con su suscripción (sin la tubería). Y guarde estos datos en la variable componente.
 options: any; this.apiService .apiMethod(input) .subscribe( (result) => { if (result.length === 1) { this.router.navigate([result[0]]); return; } options = result; } )
  1. con un ngIf en el modal (condicional de la longitud de la matriz de opciones> 0 muestra el componente con las diferentes opciones cuando se reciben los datos
 <modal-component *ngIf="options.length > 0"></modal-component>
  1. cuando el usuario (haga clic) en una opción dentro de su modal, use el enrutador para redirigir.
 html <div (click)="redirect(value)">option 1</div> ts redirect(value) { this.router.navigate([value]); }

eso seria lo mas directo

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda