2016-05-11 6 views
7

オブジェクトのストリームがあり、現在のオブジェクトが以前と同じでない場合は比較する必要があり、この場合は新しい値を出力します。私はdistinctUntilChanged演算子が私が欲しいものを正確に行うべきであることを発見しましたが、何らかの理由で、最初のものを除いて値を出力しません。私がdistinctUntilChangedを削除すると、値が正常に放出されます。RxJS distinctUntilChanged - オブジェクトcomparsion

マイコード:

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、比較器)

RxJS 5:

distinctUntilChanged =関数(比較演算、keyFn)

y docs今日、あなたはそれに注意して、V4のパラメータの順序を見つけることができます!

+0

ここにあなたの固定コードを置くと良いでしょう、 – Milad

0

私は同じ問題を抱えていたし、オブジェクトを比較するためにJSON.stringifyを使ってそれを修正:

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

ダーティ

が、動作するコード。