angular - BehaviourSubject:s distinctUntilChanged() är inte en funktion


Jag är ny på Rxjs och försöker förstå BehaviourSubject. Nedan är min kod

export interface State {
    items: Items[]
}

const defaultState = {
    items: []
};

const _store = new BehaviorSubject<State>(defaultState);

@Injectable()
export class Store {
    private _store = _store;
    changes = this._store.distinctUntilChanged()
        .do(() => console.log('changes'));

    setState(state: State) {
        this._store.next(state);
    }

    getState() : State {
        return this._store.value;
    }

    purge() {
        this._store.next(defaultState);
    }
}

När jag kör mitt projekt får jag det här felet i min konsol

platform-browser.umd.js:1900 EXCEPTION: Error: Uncaught (in promise):
EXCEPTION: Error during instantiation of Store! (StoreHelper -> Store).
ORIGINAL EXCEPTION: TypeError: this._store.distinctUntilChanged is not a function

Kan någon hjälpa mig. Dessutom försöker jag skapa en butik för mina modellobjekt, så om det finns något annat enklare sätt är du välkommen att föreslå det.

All hjälp uppskattas.

Svar #1

du måste importera hela rxJs-biblioteket eller det specifika för detta.

import 'rxjs/add/operator/distinctUntilChanged';

Uppdatera rxjs > 5.5 med Pipbara operatorer,

import { distinctUntilChanged } from 'rxjs/operators';

Pipebara operatörer hjälper till med byggande och tree shaking.

För att lära dig mer om fördelarna med rörbara operatorer kan du titta här.

Hoppas det här hjälper!!

Svar #2

Du måste faktiskt importera alla operatorer (det är do och distinctUntilChanged) och BehaviorSubject också.

import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/do';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

Se plnkr-demo: http://plnkr.co/edit/Wbqv95EiG8BnzC8BpD7E?p=preview

Förresten, jag skulle vara försiktig med uttalanden som private _store=_store eftersom det gör det väldigt svårt att läsa även om det gör det du vill.

Detta genereras från https://www.typescriptlang.org/play/.

define(["require", "exports"], function (require, exports) {
    "use strict";
    var _store = new BehaviorSubject(defaultState);
    var Store = (function () {
        function Store() {
            this._store = _store;
            this.changes = this._store.distinctUntilChanged()
                .do(function () { return console.log('changes'); });
        }
        Store.prototype.setState = function (state) {
            console.log(_store);
            this._store.next(state);
        };
        Store.prototype.getState = function () {
            return this._store.value;
        };
        Store.prototype.purge = function () {
            this._store.next(defaultState);
        };
        return Store;
    }());
    exports.Store = Store;
});

Relaterade artiklar