angular - Är detta rätt sätt att komma åt tillståndsvariabler inom en klass när man använder @ngrx/store?
Jag har en tjänst som behöver fatta beslut baserat på värdet av en variabel som lagras i AppState. Här är en kraftigt förenklad version av min tjänst:
import { Injectable } from '@angular/core';
import { Store, select } from '@ngrx/store';
interface AppState {
foo: boolean;
}
@Injectable()
export class FooProvider {
private isFoo: boolean;
constructor(private store: Store<AppState>) {
// is it foo?
store.pipe(select('foo')).subscribe((foo: boolean) => {
this.isFoo = foo;
});
}
isItFoo = (): string => this.isFoo ? "it's foo!" : 'nope, not foo';
}
Fråga: Är detta det "rätta" sättet att komma åt och använda en variabel som lagras i
AppStateinom en klass i en app som använder@ngrx/store?
I en Component tror jag att jag skulle kunna använda foo-variabeln mycket enklare med async-pipen, så här:
import { Component } from '@angular/core';
import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs';
interface AppState {
foo: boolean;
}
@Component(
selector: 'foo-component',
template: `<p>{{ ( foo$ | async ) ? "it's foo!" : "nope, not foo" }}</p>`
)
export class FooComponent {
private foo$: Observable<boolean>;
constructor(private store: Store<AppState>) {
this.foo$ = store.pipe(select('foo'));
}
}
Finns det ett bättre/enklare/mer korrekt sätt att komma åt statusvariabler inom en klass?
Svar #1
Som förklaras i detta ärende togs möjligheten att få aktuellt värde medvetet bort i ngrx eftersom den missbrukades, och nu är detta möjligt endast via en hack:
function getValue(o) {
let value;
o.take(1).subcribe(v => {
value = v;
});
return value;
}
Syftet med observables är att tillhandahålla en datastream. Lagringsvärdet kan ändras, och om en tjänst som använder det inte instansieras om, kommer den fortsätta att använda det gamla värdet. Så det förväntas att när det finns en stream, transformeras den och kombineras med andra streams och prenumereras endast där den konsumeras (oftast kommer detta att vara en vy, där den kan användas med async-rör).
I det här fallet blir det:
isItFoo$ = store.pipe(
select('foo'),
map((foo: boolean) => foo ? "it's foo!" : 'nope, not foo')
);
