如何在订阅中添加 `map` 运算符
How to add `map` operator in subscribe
在我的组件中,我从父级获取事件。 (包装器)但在我发送到模板之前,我需要迭代并在数组中添加日期值。在我通过订阅执行此操作后对我不起作用。
有人告诉我在迭代后重新分配值的正确方法吗?
这是我的尝试:
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()
}
})
})
}
在这里您可以在订阅前使用地图运算符。请参阅下面的更新代码。
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);
})
})
希望对您有所帮助!
对于 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()
}
})
})
地图适用于数组,您应该尝试使用 "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
让我知道它是否适合你。
问题是您无法在订阅方法中更改可观察值的值。您在订阅中唯一可以做的就是以某种方式使用该值。
相反,如果您想更改可观察值的值,则需要使用 map 运算符。
在下面的示例中,我们使用了两个不同的函数 map:一个是 rxjs 运算符,我们用它来更改 observable 内部的值。另一个是 javascript 原生的数组函数。我们用它来改变数组的每一项。
我在这里使用了扩展语法 (...) 因为我认为您会发现它很有用。
this.updatedEvents = this.events.pipe(
map((eventArr) => {
return eventArr.map((event) => {
...event,
date : new Date()
})
}));
在我的组件中,我从父级获取事件。 (包装器)但在我发送到模板之前,我需要迭代并在数组中添加日期值。在我通过订阅执行此操作后对我不起作用。
有人告诉我在迭代后重新分配值的正确方法吗?
这是我的尝试:
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()
}
})
})
}
在这里您可以在订阅前使用地图运算符。请参阅下面的更新代码。
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);
})
})
希望对您有所帮助!
对于 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()
}
})
})
地图适用于数组,您应该尝试使用 "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
让我知道它是否适合你。
问题是您无法在订阅方法中更改可观察值的值。您在订阅中唯一可以做的就是以某种方式使用该值。
相反,如果您想更改可观察值的值,则需要使用 map 运算符。
在下面的示例中,我们使用了两个不同的函数 map:一个是 rxjs 运算符,我们用它来更改 observable 内部的值。另一个是 javascript 原生的数组函数。我们用它来改变数组的每一项。
我在这里使用了扩展语法 (...) 因为我认为您会发现它很有用。
this.updatedEvents = this.events.pipe(
map((eventArr) => {
return eventArr.map((event) => {
...event,
date : new Date()
})
}));