@ ngrx / store忽略第一个发射值

时间:2016-08-15 10:36:49

标签: ngrx

viz.filters.Slider.prototype.componentWillMount = function(){ if(_.isArray(this.props.items)) this.setState({ entities:new viz.EntityData(this.props.items), range:_.map(this.props.defaults,"uniqueName") }); } viz.filters.Slider.prototype.onBuildAllDone = function(){ if(!_.isEmpty(this.state.range)) { this.fireEvent(vizEventType.onSelection, this.createEvent(this.state.range)); this.fireEvent(vizEventType.onNewLabel, this.createEvent(this.state.range)); } } function consumeEvent( context, event ) { if (event.name == 'ic3-report-init') { // Following code will replace a data provider for Slider // with generated numbers. But to do so, you'll need UID of // the Slider widget, in this example it's "w1" var widget = event.value.widgetMgr().getItemById("w1"); _.assign(widget.builder().guts_, { items:_.times(100, function(idx){ return { name:idx + 1 + "%", uniqueName:idx + 1 } })}) } }会发出先前的商店状态。

是否可以在不获取先前商店价值的情况下订阅“此点向前”的更改?

3 个答案:

答案 0 :(得分:6)

如果您对第一个发布值不感兴趣,您应该可以使用skip运算符:

store.select(...).skip(1)...

答案 1 :(得分:1)

跳过操作员现在需要管道,您可以像这样使用跳过:

store.pipe(select(...), skip(1));

就“ hacky”部分而言,ngrx的标准做法是设置属性设置为null的初始状态。并且该值最初会发出。因此在这种情况下,您获得的第一个值将为null。

或者,您也可以考虑skipwhile(https://www.learnrxjs.io/learn-rxjs/operators/filtering/skipwhile)并像这样使用它:

store.pipe(select(...), skipWhile(val => val === undefined));

其中undefined是您感兴趣的属性的初始值。您可以将null用作初始值,而不是将属性的初始值设置为undefined,并相应地更改上面的skipwhile()。 / p>

答案 2 :(得分:0)

在阅读@Niz 的回答后分享我的想法(和解决方案)。

这是一个完美实用的示例,说明了如何利用 nullundefined 之间的差异。当你用 null 初始化你的状态时,你基本上是在说:

<块引用>

我不在乎区分可为空的未来状态 最初的一个。我不在乎用户是否为空,因为他已经签名 退出或因为他没有登录

但是,在某些情况下,这可能还不够。考虑一下您需要异步调用(在 effects 中实现)以了解您是否有活动用户会话的情况。根据 selection 结果,您应该确定是显示登录模式还是重定向到内容页面。将初始用户状态设置为 null,您将弹出该模式,然后在该异步调用返回会话值时立即隐藏它。

将初始状态设置为 undefined 后,您可以进行区分,例如:

<块引用>

最初,我对自己的状态一无所知,然后是 undefined。当我知道它应该为空时,我会将它设置为 null

因此,作为一个实用的解决方案,我将应用程序的 initialState 上的所有内容都设置为 undefined。在上面的例子中,我需要知道在异步调用解析后是否应该显示登录模式。 skipWhile(val => val === undefined) 肯定会完成这项工作,但一遍又一遍地重复它感觉有点乏味。另外,它并不能真正描述我们的用例。我用缩短的实现创建了一个 rxjs-custom-operators.ts

import { Observable } from "rxjs";
import { skipWhile } from "rxjs/operators";

export const skipInitial = () => {
  return <T>(source: Observable <T>): Observable<T> => {
    return source.pipe(skipWhile(value => value === undefined));
  };
};

用法:

navigateOnLoad(): void {
    this.store.pipe(select(selectAuthUser), skipInitial()).subscribe((authUser: CognitoUser) => {
        // Navigate to login if !authUser, else navigate to content...
    });
}