简体   繁体   English

如何使用 Rxjs startWith 使用外部 observable 的值向 withLatestFrom 提供默认初始值?

[英]How to use Rxjs startWith to provide default initial values to withLatestFrom using outer observable's value?

this works, but I don't want to use null for initial values of startDate and endDate, I need to initialize with the values from another observable, the userInfo$ in the code below:这有效,但我不想对 startDate 和 endDate 的初始值使用 null,我需要使用来自另一个 observable 的值进行初始化,即下面代码中的 userInfo$:

export interface IUserInfo {
    UserEntryStartDate: Date;
    UserEntryEndDate: Date;
    // ...
}


public userInfo$: Observable<IUserInfo>;

private dateFilterSubject = new Subject<{
    startDate: Date;
    endDate: Date;
}>();

        this.userInfo$
            .pipe(
                withLatestFrom(
                    this.dateFilterSubject.pipe(
                        startWith({
                            startDate: null,
                            endDate: null
                        })
                    )
                )
            )
            .subscribe(([userInfo, dateFilters]) => {
                // ... do stuff
            }

This is what I'd like to do这就是我想做的

        this.userInfo$
            .pipe(
                takeWhile(() => this.active),
                withLatestFrom(user => // userInfo from outer observable
                    this.dateFilterSubject.pipe(
                        startWith({
                            startDate: user.UserEntryStartDate,
                            endDate: user.UserEntryEndDate
                        })
                    )
                )
            )
            .subscribe(([userInfo, dateFilters]) => {
                // do stuff
            }

It even gives correct autocomplete and typing on the user parameter, however I get an error on the subscribe of:它甚至提供了正确的自动完成和输入user参数,但是我在订阅时出现错误:

Type 'Observable<{ startDate: Date; endDate: Date; } | { startDate: Date; endDate: Date; }>' must have a '[Symbol.iterator]()' method that returns an iterator.

What am I doing wrong?我究竟做错了什么?

You can use BehaviorSubject for the same.您可以将BehaviorSubject用于相同的目的。 Here you can set the default value.在这里您可以设置默认值。

Example:例子:

private user = new BehaviorSubject<string>('john');

In your case:在你的情况下:

private dateFilterSubject = new BehaviorSubject<{
  startDate: Date;
  endDate: Date;
 }>({{value}});

For more info please refer:更多信息请参考:

https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubjecthttps://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject

Hope this will help.希望这会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM