【问题标题】:Angular calendar async http 'map' of undefined未定义的角度日历异步http“地图”
【发布时间】:2018-04-04 07:43:50
【问题描述】:

我尝试在我的应用程序中安装角度日历,我在数据库中有事件的数据,但是当我尝试调用它们时出现错误:

ERROR TypeError: Cannot read property 'map' of undefined at MapSubscriber.eval

原代码在这里:https://mattlewis92.github.io/angular-calendar/#/async-events

我的component.ts

import { Component, ChangeDetectionStrategy, ViewEncapsulation, OnInit } from '@angular/core';
import { ConsultaService } from '../../services/consulta/consulta.service';
import { Consulta } from '../../models/consulta.model';

//calendar imports
import { HttpClient } from '@angular/common/http';
import { CalendarEvent } from 'angular-calendar';
import { map } from 'rxjs/operators/map';
import { Observable } from 'rxjs/Observable';
import {
  /* ... */
} from 'date-fns';

const colors: any = {
  /* ... */
};

@Component({
  selector: 'app-turnos',
  changeDetection: ChangeDetectionStrategy.OnPush,
  templateUrl: './turnos.component.html',
  styleUrls: ['./turnos.component.min.css'],
  encapsulation: ViewEncapsulation.None
})
export class TurnosComponent implements OnInit {

  activeDayIsOpen: boolean = false;
  view: string = 'month';
  viewDate: Date = new Date();

  events$: Observable<Array<CalendarEvent<{ consulta: Consulta }>>>;

  constructor(
    private http: HttpClient,
    public _consultaService: ConsultaService,
  ) {}

  ngOnInit(): void {
    this.fetchEvents();
  }

  fetchEvents(): void {
    const getStart: any = {
      month: startOfMonth,
      week: startOfWeek,
      day: startOfDay
    }[this.view];

    const getEnd: any = {
      month: endOfMonth,
      week: endOfWeek,
      day: endOfDay
    }[this.view];

    this.events$ = this.http
      .get('http://localhost:3000/consulta')
      .pipe(
        map(({ results }: { results: any[] }) => {
          return results.map((consulta: any) => { // <--- error line
            return {
              title: consulta.tratamiento_c,
              start: new Date(consulta.date_a),
              color: colors.yellow,
              meta: {
                consulta
              }
            };
          });
        })
      );
  }

  dayClicked({
    /* ... */
  }

  eventClicked(event: CalendarEvent<{ consulta: Consulta }>): void {
    /* ... */
  }

}

当我使用.get 示例运行良好时,它会向我显示所有数据。但是当我更改 url 并删除参数时,通过我的 url http://localhost:3000/consulta 它不能以相同的方式工作,日历不会呈现并抛出 map 错误,如您所见,地图包含在上面。

补充一下,我的consulta.service.ts有这个功能,可以带上所有的数据。如何使用我的服务订阅和显示数据作为示例?

  cargarConsultas() {
    let url = URL_SERVICIOS + '/consulta';

    return this.http.get(url);
  }

希望您能指导我解决问题。谢谢!

更新

我换行了

map(({ results }: { results: any[] }) =&gt; {

map(( results: Consulta[] ) =&gt; {

现在我从 http 获取数据,但出现新错误:

ERROR TypeError: results.map is not a function

错误继续引用您在上面代码中标记的行

【问题讨论】:

  • 你能显示返回的json的结构吗?
  • @David mmm 谢谢你让我看到,我收到了undefined :S
  • 应该是这样的:image
  • @David 我更新了问题

标签: arrays angular typescript http angular-calendar


【解决方案1】:

更新问题的答案

那是因为webservice返回的json不是Consulta的数组,而是consultats属性的对象是数组。因此,在您的订阅中,results 不是数组

你需要将htpp调用的返回值映射(使用observable的map方法)到一个数组

cargarConsultas() : Observable<Consulta[]> 
{
   let url = URL_SERVICIOS + '/consulta';
   return this.http.get(url).map(res => res.consultas);
}

也可以直接在subscribe方法中访问正确的属性

cargarConsultas() {
 let url = URL_SERVICIOS + '/consulta';
 return this.http.get(url);
}

map(( results: any ) => 
{
return results.consultas.map(

原始问题的答案

如果你像原来一样声明 map 参数,这意味着 http 调用返回一个对象,带有一个 result 属性,如果是一个数组

 map(({ results }: { results: any[] }) 

从您提供的 json 来看,情况并非如此。 consultas 属性包含数组。所以应该是:

 map(({ consultas }: { consultas: Consulta[] }) => {
      return consultas.map((consulta: Consulta)  => {
        return {
          title: consulta.tratamiento_c,

【讨论】:

  • 安装 angular-calendar 1 天,安装 ng-fullcalendar 15 分钟,结果是肯定的。不管怎样,我稍后会测试你的代码,我会看到这个库更强大。谢谢!
猜你喜欢
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
相关资源
最近更新 更多