2016-05-11 28 views
7

Ho flusso di oggetti e ho bisogno di confrontare se l'oggetto corrente non è uguale al precedente e in questo caso emettere un nuovo valore. Ho trovato che l'operatore distinctUntilChanged dovrebbe fare esattamente quello che voglio, ma per qualche ragione, non emette mai valore tranne il primo. Se rimuovo i valori distinctUntilChanged vengono emessi normalmente.RxJS distinctUntilChanged - compendio oggetto

Il mio codice:

export class SettingsPage { 
    static get parameters() { 
     return [[NavController], [UserProvider]]; 
    } 

    constructor(nav, user) { 
     this.nav = nav; 
     this._user = user; 

     this.typeChangeStream = new Subject(); 
     this.notifications = {}; 
    } 

    ngOnInit() { 

     this.typeChangeStream 
      .map(x => {console.log('value on way to distinct', x); return x;}) 
      .distinctUntilChanged(x => JSON.stringify(x)) 
      .subscribe(settings => { 
       console.log('typeChangeStream', settings); 
       this._user.setNotificationSettings(settings); 
      }); 
    } 

    toggleType() { 
     this.typeChangeStream.next({ 
      "sound": true, 
      "vibrate": false, 
      "badge": false, 
      "types": { 
       "newDeals": true, 
       "nearDeals": true, 
       "tematicDeals": false, 
       "infoWarnings": false, 
       "expireDeals": true 
      } 
     }); 
    } 

    emitDifferent() { 
     this.typeChangeStream.next({ 
      "sound": false, 
      "vibrate": false, 
      "badge": false, 
      "types": { 
       "newDeals": false, 
       "nearDeals": false, 
       "tematicDeals": false, 
       "infoWarnings": false, 
       "expireDeals": false 
      } 
     }); 
    } 
} 
+0

'typeChangeStream' è osservabile? Difficile dire cosa non va visto senza vedere quale codice sta creando quello/ecc. –

+0

Si prega di dare un'occhiata a http://stackoverflow.com/help/mcve per le linee guida che trattano le domande "non funziona". In pratica, inserisci un esempio minimamente verificabile che riproduce l'errore e pubblica il comportamento previsto e come è diverso dal comportamento corrente. Parlare di stringere JSON è necessario sapere che non è un metodo a prova di proiettile per controllare l'uguaglianza degli oggetti. {"a": 2, "b": 1} è per esempio diverso da {"b": 1, "a": 2} mentre questi sono gli stessi oggetti – user3743222

+0

Ci scusiamo per questo, ho aggiunto altro codice. Non ho bisogno di controllo di uguaglianza degli oggetti a prova di proiettile, sono sicuro che in questo caso l'oggetto sarà sempre lo stesso ordine. –

risposta

15

ho finalmente capire dove problema. Il problema era nella versione di RxJS, in V4 e in precedenza è un ordine di parametri diverso da V5.

RxJS 4:

distinctUntilChanged = funzione (keyFn, di confronto)

RxJS 5:

distinctUntilChanged = funzione (di confronto, keyFn)

In sempre y documenti oggi, puoi trovare l'ordine dei parametri V4, fai attenzione!

+0

sarebbe buono se inserissi il tuo codice fisso qui, – Milad

0

Ho avuto lo stesso problema, e ha risolto il tutto con l'utilizzo di JSON.stringify per confrontare gli oggetti:

.distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))

codice sporco ma funzionante.