2014-07-17 31 views
0

我在Kendo UI调度程序组件中遇到了一些问题。使用远程数据(Javascript)更新Kendo UI调度程序数据源

我通过php交换web服务从ms交换中获得我的调度器事件。由于性能的原因,我不想在日历init中加载数千个元素。

因此,我只在默认情况下加载当前的周项目。在导航事件中,我想更新调度程序数据源。

我的代码是:

$("#scheduler").kendoScheduler({ 
    date: new Date(y+"/"+m+"/"+d), 
    dateHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'ddd, dd.MM.')#</strong>"), 
    startTime: new Date(y+"/"+m+"/"+d+" 00:00 AM"), 
    workDayStart: new Date(y+"/"+m+"/"+d+" 07:00 AM"), 
    workDayEnd: new Date(y+"/"+m+"/"+d+" 8:00 PM"), 
    height: 600, 
    navigate: schedulerNavigate, 
    views: [ 
     "day", 
     "week", 
     { type: "workWeek", selected: true }, 
     "month", 
     "agenda" 
    ], 
    dataSource: { 
     batch: true, 
     transport: { 
      read: { 
       url: myDataUrl, 
       dataType: "json" 
      } 
     } 
    } 
    ...and some more options here... 
}); 

“Naviagte” 事件调用schedulerNavigate()函数:

function schedulerNavigate(e) { 
    var 
     scheduler = $("#scheduler").data("kendoScheduler"), 
     dataSourceUrl = myDataUrl+kendo.format("?view={1}&date={2:d}", e.action, e.view, e.date), 
     dataSource = new kendo.data.SchedulerDataSource({ 
      transport: { 
       read: { 
        url: dataSourceUrl, 
        dataType: "json" 
       } 
      } 
    }); 

    // set datasource 
    scheduler.setDataSource(dataSource); 
} 

当进入schedulerNavigate功能,数据源的URL被调用时,将会返回JSON。一切都很好迄今... 但是:网址将被调用两次!调度程序的数据将被清除,但不会设置新数据。

有什么想法?

非常感谢!

菲利普

+1

我在猜测'navigate'事件会自动触发对窗口小部件的数据源的读取。您是否尝试过'e.preventDefault()',设置新的dataSource,然后在'schedulerNavigate'函数中手动触发'dataSource.read()'? – Brett

+0

嘿布雷特。试过你的解决方案,并在调度器的第一行添加'e.preventDefault();'函数。我还在setDataSource命令后面添加了'scheduler.dataSource.read();'。不幸的是,这并没有帮助。 – Philip

+0

嗨,我的回答是否帮助您解决问题?如果是的话,你能否将我的答复标记为答案?这样,使用Google查找问题的人可以更好地保证答案是正确的。 在此先感谢。 –

回答

1

为了达到所期望的行为,应启用“serverFiltering”调度程序的选项,并使用数据源“transport.parameterMap”功能,包括当前视图开始/结束时间的要求:

dataSource: { 
serverFiltering: true, 
transport: { 

    parameterMap: function (options, operation) {       

     if (operation === "read") { 
      var scheduler = $("#scheduler").data("kendoScheduler"); 

      var result = { 
       start: scheduler.view().startDate(), 
       end: scheduler.view().endDate() 
      } 

      return kendo.stringify(result); 
     } 

     return kendo.stringify(options); 
    }, 
    //CRUD operations 

Runnable的演示与MVC后端: