Angular 配置一个Observable以在推送新值时返回所有以前的值作为数组?

Angular 配置一个Observable以在推送新值时返回所有以前的值作为数组?,angular,typescript,rxjs5,ngfor,Angular,Typescript,Rxjs5,Ngfor,这让我很难受。我对使用RxJs观测仪还不熟悉,所以我需要一些指导 我正在尝试构建一个可观察的日志流,它可以做两件事 每当向日志文件写入新行/值时,将该新行/值推送到流中 开始使用日志文件中的值进行预填充 我已经完成了以上两个标准。现在的挑战是将其与*ngFor一起使用 *ngFor需要一个来自可观察对象的数组,这样它就可以进行添加/删除比较(我的最佳猜测)。但我的observable只返回最后一个推送项的数组 //logviewer.page.ts constructor() this.logs

这让我很难受。我对使用RxJs观测仪还不熟悉,所以我需要一些指导

我正在尝试构建一个可观察的日志流,它可以做两件事

  • 每当向日志文件写入新行/值时,将该新行/值推送到流中
  • 开始使用日志文件中的值进行预填充
  • 我已经完成了以上两个标准。现在的挑战是将其与*ngFor一起使用

    *ngFor需要一个来自可观察对象的数组,这样它就可以进行添加/删除比较(我的最佳猜测)。但我的observable只返回最后一个推送项的数组

    //logviewer.page.ts constructor()
    this.logs = Subject.create();
    this.logs$ = this.logs.asObservable()
                .startWith("logs\\error.log")
                .flatMap((fileName: string) => {
                    //start by reading the existing log files as a string
                    return this.$localStorageService.readAsStringAsync(fileName);
                })
                .map((contents: string) => {
                    //this part splits up the log file line-by-line into an log entry
                    let logs = contents.split(/\r\n|\r|\n/).filter(n => n.length > 0);
                    logs.forEach((s, ix, parent) => {
                        let x = JSON.parse(s);
                        parent[ix] = { timestamp: new Date(parseFloat(x[0])), message: x[1] };
                    })
                    return logs; //an array of objects { timestamp, message }
                })
                //merge the existing application log stream
                //throughout the application we log errors, info, etc
                //if a new entry is made it will appear here
                .merge(this.$loggerService.applicationLog$.map((x) => {                    
                    //return an array with one object { timestamp, message }
                    return [{ timestamp: new Date(parseFloat(x[0])), message: x[1] }];
                }))
    
    现在,我的模板非常简单

    //logviewer.template.ts
    <div *ngFor="let entry of logs$ | async">
        {{entry|json}}
    </div>
    
    //logviewer.template.ts
    {{entry}json}
    
    现在要测试它,我有一个按钮来添加一个条目

    //logviewer.page.ts
    addEntry() {
        this.$loggerService.error("this is a test");
    }
    
    //LoggerService.service.ts
    private applicationLog: ReplaySubject<any[]>;
    get applicationLog$(): Observable<any[]> {
        return this.applicationLog.asObservable();
    }
    
    error(...args) {
        let data = [Date.now().toString()].concat(args.map<string>((n, ix) => { return toString(n); }));
    
        // ... write to file
    
        // fire the subject
        this.applicationLog.next(data);
    }
    
    //logviewer.page.ts
    附录(){
    这是.loggerService.error(“这是一个测试”);
    }
    //LoggerService.service.ts
    私有应用程序日志:ReplaySubject;
    获取applicationLog$():可观察{
    返回此.applicationLog.asObservable();
    }
    错误(…args){
    让data=[Date.now().toString()].concat(args.map((n,ix)=>{return-toString(n);}));
    //…写入文件
    //炒掉话题
    this.applicationLog.next(数据);
    }
    
    现在,当我单击
    addEntry
    时,管道系统会正常工作,并且该值会通过可观察序列正确触发。但我的*NGF仅适用于具有单个值的更新。它不会保留以前所有日志条目的历史记录。只返回最后一个数组,这很有意义

    如何使可观察序列始终返回所有值的数组。我可以让它一次返回一个条目,但我需要完整的历史记录来满足*ngFor

    我对*ngFor和异步管道缺乏了解。我认为它订阅了observable,并自动向ngFor添加任何新条目,但事实并非如此。

    尝试使用操作符:

    this.logs$ = this.logs.asObservable()
            ...
            .merge(this.$loggerService.applicationLog$.map((x) => {                    
                //return an array with one object { timestamp, message }
                return [{ timestamp: new Date(parseFloat(x[0])), message: x[1] }];
            }))
            .scan((acc, x) => {
                acc.push(...x);
                return acc;
            }, []);