如何在订阅中添加`map`运算符

时间:2019-02-26 10:00:44

标签: angular observable rxjs6

在我的组件中,我正在从父级获取事件。 (包装器)但是在发送到模板之前,我需要迭代并在数组中添加日期值。我这样做订阅后不适用于我。

有人告诉我进行迭代后重新分配值的正确方法吗?

这是我的尝试:

import { Component, OnInit, ChangeDetectionStrategy, Input  } from '@angular/core';
import { CalendarService } from "./../../services/calendar.service";
import { ModelEvent, EventState } from "./../../models/model.event";
import { CalendarEvent } from 'angular-calendar';
import { colors } from "./../../utilities/colors";
import { setHours, setMinutes, setDate } from 'date-fns';
import { Observable } from 'rxjs';
import { tap, map } from 'rxjs/operators';
declare var $:any;

@Component({
    selector: 'ibo-calendar',
    templateUrl: './ibo-calendar.component.html',
    styleUrls: ['./ibo-calendar.component.scss']
})
export class IboCalendarComponent implements OnInit {

    // events = [];
    eventId:number | null;

    view: string = 'month';
    // viewDate: Date = new Date('August 19, 2018');
    viewDate: Date = new Date()

    @Input() events:Observable<ModelEvent[]>;
    @Input() currentEvent: ModelEvent;

    clickedDate: Date;
    updatedEvents:Observable<ModelEvent[]>;

    constructor(private calendarService:CalendarService) { }

    ngOnInit() {

        this.updatedEvents = this.events.subscribe(events => {
            console.log('events', events); //getting consoled.
            return map(event => { //not works!!
                return {
                    title : event.title,
                    name : event.name,
                    date : new Date()
                }
            })
        })

}

4 个答案:

答案 0 :(得分:2)

对于RxJS> = 6

import { map } from 'rxjs/operators'; 

尝试:

    this.updatedEvents = this.events.pipe(map(event => {
            return {
                title : event.title,
                name : event.name,
                date : new Date()
            }
        })).subscribe(events => {
           console.log(events)
        })
    })

或者您可以这样做:

    this.updatedEvents = this.events.subscribe(events => {
        this.some_val_to_render_on_html = events.map(event => 
            return {
                title : event.title,
                name : event.name,
                date : new Date()
            }
        })
    })

答案 1 :(得分:0)

在这里您可以在订阅之前使用map运算符。请参阅下面的更新代码。

import { map } from 'rxjs/operators'; 

 ngOnInit() {

    this.updatedEvents = this.events.pipe(map(event => { 
            return {
                title : event.title,
                name : event.name,
                date : new Date()
            }).subscribe(events => {
                  console.log('events', events);

        })
    })

希望获得帮助!

答案 2 :(得分:0)

地图可在数组上使用,您应尝试使用“ events.map”

 this.updatedEvents = this.events.subscribe(events => {
        console.log('events', events); //getting consoled.
        return events.map(event => {
            return {
                title : event.title,
                name : event.name,
                date : new Date()
            }
        })
    })

注意:地图已替换为events.map

让我知道它是否对您有用。

答案 3 :(得分:0)

问题是您不能在subscribe方法内部更改observable的值。在订阅中,您唯一可以做的就是以某种方式使用该值。

相反,如果要更改可观测值,则需要使用 map 运算符。

在下面的示例中,我们使用了两个称为map的不同函数:一个是rxjs运算符,我们使用它来更改可观察对象内部的值。另一个是原生于javascript的数组函数。我们使用它来更改数组的每个项目

我在这里使用了扩展语法(...),因为我认为您觉得它很有用。

 this.updatedEvents = this.events.pipe(
    map((eventArr) => {
            return eventArr.map((event) => {
                ...event,
                date : new Date()
            })
        }));