2016-05-11 8 views
7

У меня есть поток объектов, и мне нужно сравнить, если текущий объект не такой же, как предыдущий, и в этом случае испускает новое значение. Я обнаружил, что оператор differUntilChanged должен делать именно то, что я хочу, но по какой-то причине он никогда не испускает значение, кроме первого. Если я удаляю distinctUntilChanged, значения испускаются нормально.RxJS distinctUntilChanged - сопоставление объектов

Мой код:

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' наблюдаемым? Трудно сказать, что не так, не видя, какой код создает это/и т. Д. –

+0

Пожалуйста, посмотрите на http://stackoverflow.com/help/mcve, чтобы узнать, как справиться с вопросами «это не работает». В основном выведите минимально проверяемый пример, который воспроизводит ошибку, и опубликует ожидаемое поведение и то, как он отличается от текущего поведения. Поговорите о JSON, строящем, вам нужно знать, что это не пуленепробиваемый метод проверки равенства объектов. {"a": 2, "b": 1}, например, отличается от {"b": 1, "a": 2}, в то время как это те же объекты – user3743222

+0

Извините за это, я добавил еще код. Я не нуждаюсь в проверке равенства объектов с проверкой пули, я уверен, что в этом случае объект будет каждый раз в том же порядке. –

ответ

15

я, наконец, выяснить, где проблема. Проблема была в версии RxJS, в V4 и ранее - это разные параметры, чем V5.

RxJS 4:

distinctUntilChanged = функция (keyFn, Comparer)

RxJS 5:

distinctUntilChanged = функция (компаратором keyFn)

В вечно y docs сегодня, вы можете найти порядок параметров V4, остерегайтесь этого!

+0

было бы хорошо, если бы вы разместили здесь свой фиксированный код, – Milad

0

У меня была такая же проблема, и установил ее с помощью JSON.stringify для сравнения объектов:

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

Грязный, но рабочий код.

Смежные вопросы