2013-05-14 14 views
10

Ich habe einen ziemlich nervigen Bug (?) In Kendo UI Datenquelle.Kendo Datenquelle Transport benutzerdefinierte Funktion nicht aufgerufen

Meine Update-Methode auf meinem Transport wird nicht aufgerufen, wenn ich eine benutzerdefinierte Funktion übergeben, aber es funktioniert, wenn ich nur die URL geben.

Dies funktioniert:

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

Dies gilt nicht

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

Die Funktion aufgerufen wird, nicht immer, aber eine Ajax-Anforderung wird auf die aktuelle Seite URL gemacht, und die Modelldaten geschrieben wird Das ist ziemlich seltsam. Klingt für mich wie ein Käfer.

Der einzige Grund, den ich dafür brauche, ist, weil Kendo nicht herausfinden kann, dass meine Aktualisierungsaktion nur ein einzelnes Element und kein Array zurückgibt - also, da ich meine API nicht nur beugen will, um zu befriedigen Kendo, ich würde es anders herum machen.

Hat jemand dies erfahren, und kann mir in die richtige Richtung zeigen?

Ich habe auch versucht, die schema.parse, aber das wurde nicht aufgerufen, wenn die Update-Methode aufgerufen wurde.

Ich verwende myDs.sync(), um meine Datenquelle zu synchronisieren.

+0

ich gleiche Problem haben, nicht sicher, ob es festgelegt ist ... – SamJackSon

Antwort

15

Arbeiten wie mit der Demo, die aus der 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(); 
    }); 

Hier ist eine Live-Demo: http://jsbin.com/omomes/1/edit

+0

Try this: http : //jsbin.com/oguxac/1/ - einziger Unterschied ist, dass ich keine benutzerdefinierte Funktion für Read verwende. Vielleicht ist das das Problem. Wenn Sie sich die Konsole ansehen, wird ein Fehler in Kendo ausgelöst. – Jeff

+3

Das ist das Problem. Sie müssen auch eine benutzerdefinierte Funktion für read() verwenden. –

+0

Aber warum ist das notwendig? Wenn das der Fall ist, gibt es einen einfacheren Weg, um das zu tun, was ich in der Update-Methode tun muss, ohne meine eigene Funktion zur Verfügung stellen zu müssen, nur um das Ergebnis zu einem Array zu machen? – Jeff

Verwandte Themen