2016-06-02 46 views
10

Sto sottoscrizione di una proprietà negozio in un costruttore componenteObservable.subscribe() funziona solo una volta (NGRX angular2)

constructor(private someService: SomeService){ 
     someService.someObservable.subscribe((data: Some)=> { 
      this.some = data; 
      console.log('changed'); 
     }); 
} 

Nel servizio, il costruttore si presenta così:

constructor(private store: Store<any>){ 
     this.someObservable = <Observable<{}>>store.select('some'); 
} 

Continuo a modificare lo stato di questo oggetto, ma la registrazione viene visualizzata solo una volta. Ciò che è strano è che sto accedendo alla proprietà this.some direttamente nel mio modello (senza async pipe) e si aggiorna perfettamente! Sembra che la proprietà this.some sia in fase di aggiornamento, ma l'next() nell'abbonamento non funziona.

aiutare qualcuno? Grazie!

+2

come è il tuo servizio? – paulpdaniels

+0

Nel costruttore del server sto esponendo il 'Observable', come questo:' this.some = > store.select ('some') ' –

+0

Sono confuso. È 'some' e Observable o i tuoi dati? puoi aggiungere codice più completo al tuo esempio? Preferibilmente qualcosa che può essere eseguito e riprodurre il problema? – paulpdaniels

risposta

1

Non è necessario chiamare i servizi nel costruttore ed è considerato come una cattiva pratica. Utilizzare il metodo ngOnInit() per iscriversi a un servizio. Questo metodo verrà chiamato automaticamente quando il componente si sta caricando.

Prova in questo modo, questo potrebbe risolvere il tuo problema.

import {Component, OnInit} from "@angular/core"; 

export class YourComponent implements OnInit{ 

    ngOnInit():void { 
     //handle your subscription here 
    } 

} 
+1

Non funziona. Forse ha qualcosa a che fare con 'ChangeDetectionStrategy'? –

+1

il tuo consiglio è a posto ma questo non risponde alla domanda.posizionare i calcoli nel tuo costruttore ritarda solo l'istanza dell'oggetto e non puoi accedere alle proprietà – svarog

+0

@svarog, in effetti non causerà alcun ritardo perché osservabile è asincrono. Il modo corretto per implementarlo è suggerito da 'icsapper'. – Pradeep

0

Assicurarsi che si sta restituendo un nuovo oggetto dal riduttore se si aggiorna una proprietà e ritorni allo stesso oggetto non innescherebbe evento di aggiornamento negozio

interruttore (action.type) {

case MAIN_MENU_TOGGLE : { 

Ex tornare Object.assign ({}, appSettings, {isMainMenuExpand: bandiera})}

+0

Lo sto facendo, non è questo il problema –

1

Nel mio caso molto simile il problema era che una delle s i gestori di ubscription lanciavano un errore. Quando si verifica un errore, il flusso osservabile interrompe l'emissione di nuovi valori.