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

88
Visualizações
Flujo RXJS para esperar hasta que el elemento se desenfoque antes de que se ejecute la suscripción

Quiero realizar un seguimiento cuando cambia el valor de una entrada y solo cuando el elemento está borroso quiero que se active la suscripción.

Por supuesto que podría hacer algo como lo que tengo a continuación, pero eso, por supuesto, no es muy elegante. ¿Alguna sugerencia?

 fromEvent(inputElement, 'input) .subscribe((e) => { fromEvent(inputElement, 'blur') .subscribe((blurEv) => { // Do something with inputElement.value }); });

Supongo que podría simplemente escuchar el evento de desenfoque, pero todavía hay ciertas circunstancias en las que necesitaría realizar un seguimiento de los cambios de entrada de minutos antes de que ocurra el desenfoque.

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Puede configurar la opción updateOn para blur , luego form.valueChanges solo se emitirá cuando un campo esté borroso:

 export class AppComponent { form = this.fb.group({ name : '', age : '', email : '' }, { updateOn: 'blur' }); subscription = this.form.valueChanges.subscribe( value => console.log('>>> value on blur:', value) ); constructor(private fb: FormBuilder) { } }

Aquí hay una demostración básica de StackBlitz .

about 4 years ago · Juan Pablo Isaza Relatório

0

Primero, nunca debe suscribirse dentro de una suscripción. Puede usar operadores de aplanamiento observables como concatMap , mergeMap y switchMap . Así que lo más fácil que puedes hacer es arreglar eso.

 fromEvent(inputElement, 'input').pipe( switchMap(() => fromEvent(inputElement, 'blur')) ).subscribe((blurEv) => { // Do something with inputElement.value });

Honestamente, es difícil pensar en algo mejor a menos que no sepas más sobre tus necesidades. El único problema con esto es que la suscripción al evento se creará después de cada entrada. Puede resolver eso con fusionar y escanear si necesita mantener un estado.

Los siguientes usos se fusionan para suscribirse a eventos de enfoque y desenfoque solo una vez. Cuando está enfocado, se emite un objeto con una propiedad oldval , y cuando está borroso, se emite un objeto con una propiedad newval . Las emisiones se fusionan con el estado anterior mediante el escaneo para crear un nuevo estado. Esto tendrá el efecto de crear un objeto con propiedades oldval y newval que se pueden comparar.

 merge( fromEvent(el, 'focus').pipe(map(x => ({ oldval: el.value, state: 'hasfocus' }))), fromEvent(el, 'blur').pipe(map(x => ({ newval: el.value, state: 'lostfocus' }))) ).pipe( scan((acc, cur) => ({ ...acc, ...cur }), {}), filter(x => x.state === 'lostfocus') ).subscribe(/* Do something */);
about 4 years ago · Juan Pablo Isaza Relatório

0

Prueba esto:

 const blur$ = fromEvent(trackedEl, 'blur').pipe(take(1)) fromEvent(trackedEl, 'input').pipe( distinctUntilChanged(), switchMap(() => blur$) ).subscribe((v) => { // Do work })
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