Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kendo Datasource Transport custom function not getting called

Tags:

kendo-ui

Im experiencing a rather annoying bug (?) in Kendo UI Datasource.

My Update method on my transport is not getting called when I pass a custom function, but it does work if I just give it the URL.

This works:

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

This does not

...
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]);
            }
      });
   }
}
...

The function is not getting invoked, but an ajax request is made to the current page URL, and the model data is being posted, which is rather odd. Sounds like a bug to me.

The only reason I have a need for this, is because Kendo can't figure out that my update action returns only a single element, and not an array - so, since I dont want to bend my API just to satisfy Kendo, I though I'd do it the other way around.

Have anyone experienced this, and can point me in the right direction?

I also tried using the schema.parse, but that didn't get invoked when the Update method was being called.

I use myDs.sync() to sync my datasource.

like image 290
Jeff Avatar asked May 14 '13 13:05

Jeff


1 Answers

Works as expected with the demo from the 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();
  });

Here is a live demo: http://jsbin.com/omomes/1/edit

like image 138
Atanas Korchev Avatar answered Oct 03 '22 13:10

Atanas Korchev