2013-05-14 78 views
10

在Kendo UI Datasource中遇到了一个相当恼人的bug(?)。Kendo Datasource运输自定义函数没有被调用

当我传递一个自定义函数时,我的传输方式上的更新方法没有被调用,但是如果我只是给它一个URL,它就会工作。

这工作:

... 
transport: { 
    update: { url: "/My/Action" } 
} 
... 

这不

... 
transport: { 
    update: function(options) { 
     var params = JSON.stringify({ 
      pageId: pageId, 
      pageItem: options.data 
     }); 
     alert("Update"); 
     $.ajax({ 
      url: "/My/Action", 
      data:params, 
      success:function(result) { 
       options.success($.isArray(result) ? result : [result]); 
      } 
     }); 
    } 
} 
... 

的功能没有得到调用,而是一个AJAX请求到当前页面的URL造的,模型数据被公布,这很奇怪。听起来像是一个bug。

我需要这个的唯一原因是,因为Kendo无法弄清楚,我的更新操作只返回一个元素,而不是数组 - 因此,我不想弯曲我的API只是为了满足剑道,虽然我会以相反的方式去做。

有没有人遇到过这种情况,可以指出我正确的方向?

我也尝试过使用schema.parse,但是当Update方法被调用时没有被调用。我使用myDs.sync()来同步我的数据源。

+0

我有同样的问题,如果不知道它是固定的... – SamJackSon 2014-05-14 09:03:58

回答

15

按预期工作从documentation演示:

var dataSource = new kendo.data.DataSource({ 
    transport: { 
     read: function(options) { 
     $.ajax({ 
      url: "http://demos.kendoui.com/service/products", 
      dataType: "jsonp", 
      success: function(result) { 
      options.success(result); 
      } 
     }); 

     }, 
     update: function(options) { 
     alert(1); 
     // make JSONP request to http://demos.kendoui.com/service/products/update 

     $.ajax({ 
      url: "http://demos.kendoui.com/service/products/update", 
      dataType: "jsonp", // "jsonp" is required for cross-domain requests; use "json" for same-domain requests 
      // send the updated data items as the "models" service parameter encoded in JSON 
      data: { 
      models: kendo.stringify(options.data.models) 
      }, 
      success: function(result) { 
      // notify the data source that the request succeeded 

      options.success(result); 
      }, 
      error: function(result) { 
      // notify the data source that the request failed 
      options.error(result); 
      } 
     }); 
     } 
    }, 
    batch: true, 
    schema: { 
     model: { id: "ProductID" } 
    } 
    }); 

    dataSource.fetch(function() { 
    var product = dataSource.at(0); 
    product.set("UnitPrice", product.UnitPrice + 1);   
    dataSource.sync(); 
    }); 

这里有一个现场演示:http://jsbin.com/omomes/1/edit

+0

试试这个:HTTP ://jsbin.com/oguxac/1/ - 唯一的区别是我没有使用Read的自定义函数。也许这就是问题所在。如果你看一下控制台,剑道会抛出一个错误。 – Jeff 2013-05-14 13:41:14

+3

这就是问题所在。您还需要使用read()的自定义函数。 – 2013-05-14 13:42:08

+0

但为什么这是必要的?如果是这种情况,有没有更简单的方法来做我需要做的更新方法,而不必提供我自己的功能只是为了将结果放入数组? – Jeff 2013-05-14 13:43:04