2016-07-14 17 views
5

Sfondoabbonamento @ NGRX/negozio per parte di un negozio e di evitare il rilevamento modifiche ad altre parti

Uno dei riduttori nelle mie offerte negozio con le cose che vengono selezionati all'interno della app. L'interfaccia di questo negozio (diciamo chiamavano app) potrebbe apparire come segue:

interface IApp { 
    selectedProject: IProject; 
    selectedPart: IPart; 
} 

Quindi io voglio avere un abbonamento che esegue un'azione solo quando si seleziona un 'progetto' diverso. Ho scritto qualcosa di simile:

this.store.select('app') 
    .map((store: IApp) => store.selectedProject) 
    .subscribe((project: IProject) => { 
     // Stuff happens here 
    }); 

Questa funzione fa cose quando selectedProject modifiche. Tuttavia, lo fa anche quando cambia selectedPart. Chiaramente, ascolta l'intero negozio app, indipendentemente dalla mappa. Ciò ha senso.

Domanda

non voglio che questo accada. Voglio solo che la mia funzione venga eseguita quando le modifiche sono selectedProject.

So che posso dividere selectedProject e selectedPart in diversi negozi per risolvere questo. Tuttavia, potrei finire rapidamente con molti, molti negozi. Forse questo come dovrebbe essere?

C'è un altro modo però? Posso mantenere il negozio con questa interfaccia e avere un abbonamento che rileva solo le modifiche alla parte dello store selectedProject?

risposta

7

Credo che stiate cercando distinctKeyUntilChanged.

this.store.select('app') 
    //Only emit when selectedProject has changed 
    .distinctUntilKeyChanged(
    //Key to filter on 
    'selectedProject', 
    //Optional comparison function if you have a specific way of comparing keys 
    (x, y) => x.projectName === y.projectName) 
    .pluck('selectedProject') 
    .subscribe((project: IProject) => {}); 
+0

sì! questo è esattamente quello che stavo cercando. Grazie. – freethebees

Problemi correlati