Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

365
Vistas
Angular 2: suscripción ngrx ejecutándose en cada cambio de estado

Tengo una implementación redux básica con ngrx/store.

// reductor de raíz

 export const root = { posts: fromPosts.reducer, purchases: fromPurchases.reducer } export function getAllPosts( state ) { return fromPosts.getAll(state.posts); } export function getAllPurchases( state ) { return fromPurchases.getAll(state.purchases); }

En mi componente, estoy seleccionando las piezas de estado.

 this.posts$ = store.select(getAllPosts).do(c => console.log('posts$ change')); this.purchases$ = store.select(getAllPurchases).do(c => console.log('purchases$ change'));

Pero en cada cambio de estado, ambos controladores se ejecutan. Por ejemplo, cuando agrego una publicación, el controlador purchases$ también se ejecuta.

Todo el punto es ejecutar solo la parte que cambió, ¿o estoy equivocado?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Esta respuesta es incorrecta, pero, por alguna razón, fue aceptada. La implementación de select usa distinctUntilChanged , por lo que es probable que el problema resida en las implementaciones de las funciones getAll del OP.

Cada vez que se envía una acción a la tienda, se pasa a los reductores compuestos y se compone un nuevo estado. Entonces se emite ese nuevo estado.

Entonces, ambos observables verán un valor emitido a los operadores do , incluso cuando la porción de estado seleccionada no haya cambiado.

Sin embargo, es simple cambiar este comportamiento usando el operador distinctUntilChanged :

 import 'rxjs/add/operator/distinctUntilChanged'; this.posts$ = store.select(getAllPosts) .distinctUntilChanged() .do(c => console.log('posts$ change'));

distinctUntilChanged se asegurará de que el observable solo se emita cuando el valor realmente haya cambiado, por lo que si la porción de estado que está seleccionando no ha cambiado, no se emitirá nada.

over 4 years ago · Santiago Trujillo Denunciar

0

Tus selectores no usan createSelector.

Cuando se usa createSelector y cuando cambia el estado, createSelector memoriza el valor de retorno en función de sus valores de parámetro.

Cuando se vuelve a llamar a la función definida con createSelector con los mismos parámetros memorizados, se proporciona el valor de retorno y el resto del código del selector no se ejecuta.

 /** * Every reducer module exports selector functions, however child reducers * have no knowledge of the overall state tree. To make them usable, we * need to make new selectors that wrap them. * * The createSelector function creates very efficient selectors that are memoized and * only recompute when arguments change. The created selectors can also be composed * together to select different pieces of state. */ export const getBookEntitiesState = createSelector( getBooksState, state => state.books );

Ejemplo de uso (aunque este es un hilo antiguo y el ejemplo es de un NGRX más nuevo) https://github.com/ngrx/platform/blob/master/example-app/app/books/reducers/index.ts#L58

over 4 years ago · Santiago Trujillo Denunciar

0

Dado que la implementación de select usa distintUntilChanged , y

distinguibleUntilChanged utiliza la comparación === de forma predeterminada, las referencias a los objetos deben coincidir. https://www.learnrxjs.io/operators/filtering/distinctuntilchanged.html

probablemente el problema radica en el hecho de que no importa qué acción se envíe a su reducer , devuelve una nueva referencia del estado (incluso cuando el valor del estado no se ha cambiado).

verifique su declaración de cambio de reductor, la sección predeterminada, probablemente copia en profundidad el estado cuando no se cambian los valores, por lo tanto, devuelve una nueva referencia y el selector se ejecuta nuevamente.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda