问题描述
我正在尝试使用 Vuejs 从 Fullcalendar 实现时间轴日历,但日历在数据准备好之前正在初始化。如果我导航到其他页面并返回,它会起作用......所有数据都在那里。我创建了方法:getEmployees() 和 getApprovedAbsences(),以创建包含所需数据的数组。 我对 Vue js 还很陌生,所以任何帮助将不胜感激。谢谢
代码:
<template>
<div class="admin-calendar">
<FullCalendar :options="calendarOptions" />
</div>
</template>
<script>
import FullCalendar from '@fullcalendar/vue'
import dayGridplugin from '@fullcalendar/daygrid'
import interactionPlugin from '@fullcalendar/interaction'
import resourceTimelinePlugin from '@fullcalendar/resource-timeline'
import ptLocale from '@fullcalendar/core/locales/pt';
import moment from "moment";
export default {
components: { FullCalendar },props: {
getAbsencesRequests: {
type: Array,},employees: {
type: Array,data() {
return {
calendarOptions: {
plugins: [ resourceTimelinePlugin ],headerToolbar: {
left: 'today prev,next',center: 'title',right: 'resourceTimelineDay,resourceTimelineWeek,resourceTimelineMonth'
},locales: [ ptLocale ],locale: 'pt',aspectRatio: 1.6,initialView: 'resourceTimelineDay',resourceGroupField: 'department',resourceAreaHeaderContent: 'Colaboradores',handleWindowResize: false,height: 400,resources: this.getEmployees,events: this.getApprovedAbsences,}
}
},methods: {
async getApprovedAbsences() {
let absenceList = []
this.getAbsencesRequests.forEach(absence => {
if (absence.status === "APPROVED") {
absence.periods.forEach((period) => {
absenceList.push({
start: moment(period.validFromLocaleDate,"DD/MM/YYYY").format("YYYY-MM-DD"),end: moment(period.validToLocaleDate,title: absence.absenceName,resourceId: absence.requesterId,});
});
}
})
return absenceList
},async getEmployees() {
let employeeList = []
this.employees.forEach(employee => {
employeeList.push({
id: employee.id,department: employee.department["id"] === "" ? "SEM DEPARTAMENTO ATRIBUÍDO" : employee.department["name"],title: employee.name,})
})
return employeeList
}
},}
</script>
解决方法
您可以添加 if 语句来检查数据是否准备就绪。像这样:
<template>
<div class="admin-calendar">
<FullCalendar
v-if="employeeList && absenceList"
:options="calendarOptions" />
</div>
</template>
这只会在资源和事件不为空后加载 FullCalendar 组件。
现在,将 data
更改为:
data() {
return {
employeeList: null,absenceList: null,calendarOptions: {
plugins: [ resourceTimelinePlugin ],headerToolbar: {
left: 'today prev,next',center: 'title',right: 'resourceTimelineDay,resourceTimelineWeek,resourceTimelineMonth'
},locales: [ ptLocale ],locale: 'pt',aspectRatio: 1.6,initialView: 'resourceTimelineDay',resourceGroupField: 'department',resourceAreaHeaderContent: 'Colaboradores',handleWindowResize: false,height: 400,resources: this.getEmployees,events: this.getApprovedAbsences,}
}
}
并更改加载方法以将数据存储在组件变量中:
methods: {
async getApprovedAbsences() {
let tmpAbsenceList = []
this.getAbsencesRequests.forEach(absence => {
if (absence.status === "APPROVED") {
absence.periods.forEach((period) => {
tmpAbsenceList.push({
start: moment(period.validFromLocaleDate,"DD/MM/YYYY").format("YYYY-MM-DD"),end: moment(period.validToLocaleDate,title: absence.absenceName,resourceId: absence.requesterId,});
});
}
})
absenceList = tmpAbsenceList
},async getEmployees() {
let tmpEmployeeList = []
this.employees.forEach(employee => {
tmpEmployeeList.push({
id: employee.id,department: employee.department["id"] === "" ? "SEM DEPARTAMENTO ATRIBUÍDO" : employee.department["name"],title: employee.name,})
})
employeeList = tmpEmployeeList
}
},
最后,在 created()
中调用 getMethods:
async created() {
await this.getApprovedAbsences()
await this.getEmployees()
}
这应该首先加载所有内容,然后调用 FullCalendar。它应该保证在加载组件之前一切都设置好了。试试看,看看这个想法是否适合你...