【问题标题】:Event data not being populated dynamically in Fullcalendar 4在 Fullcalendar 4 中未动态填充事件数据
【发布时间】:2019-08-10 03:15:56
【问题描述】:

我有一个数据库,其中包含一个月/期间的所有事件。我使用了 http.get 并获得了 JSON 文件。该文件具有附加数据,必须先对其进行修改或格式化,然后才能将其用作事件。例如:对于事件标题: name +id 。 所以我已经对其进行了相应的格式化并将其作为字符串存储在局部变量中。我正在尝试将此变量分配为事件数据。但这并没有被填充。

我已经尝试使用 Array.to(var) 将字符串转换为 Array。结果还是一样。我还尝试将其存储在 uri 中并传递与事件数据相同的 url: uri。这也未能显示该事件。 阅读有关 addEvent 方法的完整日历文档。但我对 Angular 8 比较陌生,所以不知道如何实现它。

所以,没有错误,但我似乎错过了大局。我会把我正在做的所有事情都说出来。 有一个接口evtdata:

export interface Evtdata {

  startRecur?: any,
  endRecur?: any,
  startTime?: any,
  endTime?: any,
  title?: any,
  daysOfWeek?: any

}

更新的组件:

this.options$ = this.evts.getEventDat().pipe(
      map(data => {
        for (var i = 0; i < this.data.length; i++) {
                this.eventdat[i].startRecur = "\""+data[i].startDate+"\"";
                this.eventdat[i].endRecur = "\""+data[i].endDate+"\"";
                this.eventdat[i].startTime ="\""+ data[i].startTime+"\"";
                this.eventdat[i].endTime = "\""+data[i].endTime+"\"";
                this.eventdat[i].title ="\""+ data[i].name + " " + data[i].wwid+" "+data[i].sId+"\"";
                this.eventdat[i].daysOfWeek ="\""+ "[" + data[i].workDays + "]"+"\"";
              }
            return {
             businessHours: {
                daysOfWeek: [1, 2, 3, 4, 5],
                startTime: '00:00',
                endTime: '24:00',
              },
              editable: true,
              customButtons: {
              },
              header: {
                left: 'prev,next',
                center: 'title',
                right: 'dayGridMonth,listView,timeGridWeek,timeGridDay'
              },
              plugins: [dayGridPlugin, interactionPlugin, listPlugin, bootstrapPlugin, timeGrigPlugin],
              events: this.eventdat
            }

      })

    );

日历.html



<full-calendar
 *ngIf="options$ | async"

  #fullcalendar
  themeSystem="bootstrap"
  [businessHours]="(options$ | async).businessHours"
  [editable]="true"
  [events]="(options$ | async).events"
  [header]="(options$ | async).header"
  [customButtons]="(options$ | async).customButtons"
  [plugins]="(options$ | async).plugins"
  (addEventSource)="addEventSource($event)"
  (eventClick)="eventClick($event)"
  (setProp)="setProp($event)"

></full-calendar>

我添加了多个日志来显示数据,数据正在保存并按所需顺序执行。事件仍未填充。

【问题讨论】:

  • 这里似乎有很多不必要的代码。首先,如果要添加 .then 块,则不需要 async/await。其次,看起来您正在尝试以某种方式以字符串格式编写 JSON……您为什么要尝试将所有内容都作为字符串进行操作?为什么不简单地将它作为一个对象来操作呢?您可以使用 JSON.parse() 将 JSON 格式的字符串转换为对象。
  • 添加了异步部分,因为在从响应中获取数据之前,它正在执行其余的代码,所以我不得不让其余的代码等待。据我了解,我必须将 Array 作为事件源传递。我将许多转换为字符串,因为我需要上述格式。如果有更好的格式化 json 响应的方法,请告诉我
  • 要么你放入一个 async/await,此时你不需要一个 .then 块,要么你放一个 .then 块,并且在接收到数据后需要发生的任何事情都会进行在那个然后阻止。最好避免将两者混为一谈。至于其余的……你想做什么真的不是很清楚。请包括您从服务器返回的格式以及需要转换的格式。
  • 另外,你为什么使用 toPromise?你是在改造 HttpClient 暴露的 Observable 吗?
  • JSON 响应:` 名称:某物,ID:某物,开始:,结束:,开始时间:,结束时间:` 我试图将其更改为事件可接受的格式:` 标题:包含名称和id 和 starttime,endtime 等等。我现在正在接收数据,但无法在 FullCalendar 中显示数据。数据似乎不是问题

标签: javascript angular typescript fullcalendar-4


【解决方案1】:

您正在对数据进行各种操作,但我真正了解的很少。如果你在做一个 HTTP 调用,它会返回一个 Observable。然后,您可以在 map 运算符中 pipe 添加/删除/修改您需要的任何内容。然后,您可以在模板中使用async 管道来避免所有订阅问题。

ngOnInit() {
  this.options = this.evts.getEventDat().pipe(
    map(data => {
      // format your options object here, using the data object as needed
      // don't forget that this map operator is NOT the same as Array map
      // you can of course do an Array map in here as well if you need to
    })
  );
}

然后,在模板中:

<full-calendar
  *ngIf="options | async"

  #fullcalendar
  themeSystem="bootstrap"
  [businessHours]="(options | async).businessHours"
  [editable]="true"
  [events]="(options | async).events"
  [header]="(options | async).header"
  [customButtons]="(options | async).customButtons"
  [plugins]="(options | async).plugins"
  (eventClick)="eventClick($event)"
  (setProp)="setProp($event)"


></full-calendar>

我仍然不明白你的很多格式。感觉就像您正在尝试将 JSON 作为字符串来操作,而您不需要这样做。你可以把它当作一个对象来操作,这就是重点。

附:如果您需要在 JSON 和字符串表示法之间来回切换,请使用 JSON.parse(myString) 和 JSON.stringify(myObject)。

【讨论】:

  • 会尝试一下并回复您!
  • 在分配 this.options = ... 行时似乎有错误。错误是:类型“Observable”没有与类型“OptionsInput”相同的属性。
  • 你需要将this.options声明为Observable&lt;OptionsInput&gt;
  • 我对 Angular 比较陌生,如果这是我应该做的,请告诉我:getEventDat():Observable&lt;OptionsInput&gt;{ return this.http.get(this._url); }
  • 您的 getEventDat() 方法不会返回 OptionsInput 类型的 Observable,因此不需要更改。它是您日历组件中的 Observable pipe 执行此操作。请记住,this.options 将是 pipe 末尾吐出的任何类型的 Observable。在您的日历组件中,您设置选项:Observable,并确保您的转换创建了一个有效的OptionsInput 对象。 (我还建议使用 options$ 作为变量名,因为规范是在类似 Observable 的变量名的末尾添加 $)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2019-07-13
相关资源
最近更新 更多