使用meteor优化fullcalendar以获取大数据

时间:2017-06-06 14:28:38

标签: fullcalendar

我正在使用一个自动运行块,我用一些会话变量重新执行相同的mongo!循环遍历那些doc,构造一个事件数组然后我调用addEventSource和refetchResources函数,这些函数在计算上非常昂贵! fullcalendar越慢,数据越多!在每个动作上重新运行自动运行块!你认为你可以做些什么来加快速度?我想过只重新渲染delta元素,但这不包括删除和更新。

   calendar = $('#calendar').fullCalendar({
    schedulerLicenseKey: Meteor.settings.public.fullCalendarLicenseKey,
    now: new Date(),
    editable: true, // enable draggable events
    droppable: true, // this allows things to be dropped onto the calendar
    aspectRatio: 1.8,
    timezone:'local',
    disableDragging: true,
    displayEventTime: false,
    selectable:true,
    allDaySlot:true,
    slotDuration:'24:00',
    lazyFetching:true,
    resourceLabelText: 'Employees',
    nextDayThreshold:"12:00",
    resources: function(callback) {
      var tmp_obj = { usersSorting : { } };
      tmp_obj.usersSorting["indexByLocation."+Session.get("locationId")] = 1;
      var users = [];
      var data = Meteor.users.find({
        $or:[
          {"profile.showInScheduler":{$exists:false}},
          {"profile.showInScheduler":true}
        ],
        assignedTo:{$in:[Session.get("locationId")]},
        'locations._id':Session.get("locationId"),
        "profile.companyId":Session.get("companyId")
      },{sort : tmp_obj.usersSorting});

      var arr = data.map(function(c) {
        var employeeType = c.userSettings.employeeType;
        var type = EmployeeType.findOne({_id:employeeType});
        var img = Images.findOne({_id: c.picture});
        var imgUrl = img ? img.url() : "/images/default-avatar.png";
        c.name = c.name || "";

        var totalHoursAllLocation = 0;
        var totalHoursCurrentLocation = 0;
        return {
          id: c._id,
          title: "t",
          width:"2px"
        };
      });
      callback(arr);
    },
    drop: function(date, jsEvent, ui, resourceId) {
    },
    eventResize: function( event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view )  {
    },
    dayClick: function(date, jsEvent, view,res,res2) {

    },
    eventClick: function ( event, jsEvent, view )  {
    }
  }).data().fullCalendar;


  /********************* reactive calendar *****************/
  this.autorun(function() {


  if(Session.get("activeUsers")) {
    schedulerSubs = Meteor.subscribe("SchedulesByLocation", Session.get("companyId"), Session.get("locationId"), Session.get("activeUsers"), moment(Session.get("currentDate")).startOf('week').toDate(), moment(Session.get("currentDate")).startOf('week').add(2, "weeks").endOf('isoweek').add(1,"days").toDate());
  }

    const company = Companies.findOne({_id: Session.get("companyId")});
    Session.set("loading", true);
    let events = [];
    let usersInLocation = Meteor.users.find({
      assignedTo: {$in: [Session.get("locationId")]},
      'locations._id': Session.get("locationId"),
      "profile.companyId": Session.get("companyId")
    }).fetch();
    let userIds = _.map(usersInLocation, "_id");
    userIds.push("temp" + Session.get("companyId") + Session.get("locationId"));
    Session.set("activeUsers",userIds);
    if(schedulerSubs && schedulerSubs.ready()) {
      var data;

    SchedulerEvts = Schedules.find({
      uid: {$in: userIds},
      locationId: Session.get("locationId"),
      companyId: Session.get("companyId"),
      start: {$gte: moment(Session.get("currentDate")).startOf('week').toDate()},
      end: {$lte: moment(Session.get("currentDate")).add(2, "week").endOf('isoweek').toDate()}
    }).fetch();

      SchedulerEvts.forEach(function (evt) {
        var event = null;
        var color = "";
        var oloc = "";
        var attendance = null;
        var locationName = "";
        var id = evt._id;


      event = {
        id:id,
        type : evt.type,
        title: evt.name,
        start: evt.start,
        end: evt.end,
        color:color,
        resourceId: evt.uid,
        locationName:locationName,

      };

        events.push(event);
      });


      if (calendar) {
        calendar.removeEvents();
        calendar.addEventSource(events);
        calendar.refetchResources();
      }
    }

0 个答案:

没有答案