Kendo Ui DataSource添加功能无法正常工作

时间:2014-04-24 20:27:27

标签: kendo-ui datasource add

我定义了一个剑道数据源,如下所示。它在ListView中填充值。

 var datasourceAppList = new kendo.data.DataSource({
    transport: {
      create: function(options){
        //alert(options.data.desc);
        alert(options.data.desc);
        var localData = JSON.parse(localStorage.getItem("LsAppList"));
        localData.push(options.data);
        localStorage.setItem("LsAppList", JSON.stringify(localData)); //localStorage["LsAppList"] = JSON.stringify(localData); 
        options.success(localData);
      },
      read: function(options){ 
          var localData = JSON.parse(localStorage["LsAppList"]); 
          options.success(localData);
      },
      update: function(options){
        var localData = JSON.parse(localStorage["LsAppList"]); 
        for(var i=0; i<localData.length; i++){
          if(localData[i].extappId == options.data.extappId){
            localData[i].desc = options.data.desc;
            localData[i].deviceNo = options.data.deviceNo;
            localData[i].validationKey = options.data.validationKey;
          } 
        }
        localStorage["grid_data"] = JSON.stringify(localData); 
        options.success(localData);
      },
      destroy: function(options){ 
        var localData = JSON.parse(localStorage["LsAppList"]); 
        localData.remove(options.data.ID);
        localStorage["LsAppList"] = JSON.stringify(localData); 
        options.success(localData);
      },
    },
        schema: {
      model: {
        extappId: "ID",
        fields: {
          extappId: { type: "number" },
          desc: { type: "string" },
          deviceNo: { type: "number" },
          validationKey: { type: "string" }
        }}
    },
  });

首先:我调用以下代码。它将数据正确地添加到页面列表视图和localStorage。

datasourceAppList.add({ extappId: "9905", desc: "test", deviceNo: "5", validationKey: "CACACACA"});

datasourceAppList.sync();

第二:我调用以下代码

datasourceAppList.add({ extappId: "9908", desc: "harvest", deviceNo: "7", validationKey: "ppppppp"});

datasourceAppList.sync();

问题:

  1. 页面显示第一条记录两次。
  2. localstorage是第一条记录的2倍,第二条记录的1倍。
  3. 我做错了什么?

    ---还存在一个问题。虽然localStorage是正确的,但listview填充错误。

    第一个记录添加:ListView是正确的 第二个记录添加:ListView是Corract 第三条记录添加:前两行显示第一条记录,最后一条显示最后一条记录。

    我的HTML代码是

    <div id="applications" data-role="view"  data-title="Defined Applications" data-layout="default" data-model="appdetail">
        <ul id="applist" data-role="listview" data-style="inset" data-source="datasourceAppList" data-template="tmp" data-click="listViewClick" data-auto-bind="true"></ul>
    
    
        <p align="center">
            <a  style="width: 30%" data-role="button" data-rel="modalview" data-click="showModalViewAdd" id="buttonAddApplication" data-icon="ecg-plus">Add</a>
            <a  style="width: 30%" data-role="button" data-rel="modalview" data-click="refreshApplicationList" id="buttonRefreshApplication" data-icon="refresh">Refresh</a>
        </p>
    
    </div>
    
    <script id="tmp" type="text/x-kendo-template">
        <a id = "#: extappId #">#: desc # </a>
    
    </script>
    

1 个答案:

答案 0 :(得分:6)

这实际上是一个综合问题:

schema的定义是:

schema: {
    model: {
        extappId: "ID",
        fields: {
            extappId: { type: "number" },
            desc: { type: "string" },
            deviceNo: { type: "number" },
            validationKey: { type: "string" }
        }
    }
 }

它说extappId: "ID" ......这是什么?您是否想说extappId是该记录的id?如果是这样,实际定义应该是:

schema: {
    model: {
        id: "extappId",
        fields: {
            extappId: { type: "number" },
            desc: { type: "string" },
            deviceNo: { type: "number" },
            validationKey: { type: "string" }
        }
    }
 }

这里发生的事情不是(正确)定义id,KendoUI期望id实际上是id,因为这不会在create下一次设置你sync试图保存它的时间,相当于:

datasourceAppList.add({ extappId: 9905, desc: "test", deviceNo: 5, validationKey: "CACACACA"});
datasourceAppList.add({ extappId: 9908, desc: "harvest", deviceNo: 7, validationKey: "ppppppp"});
datasourceAppList.sync();

但是如果你试试这个,你会看到然后永远不会调用create。现在发生的事情是记录的id(即extappId)已经定义而不是null,因此KendoUI认为已经保存了。

为了解决第二个问题,我的建议是将schema定义为:

schema: {
    model: {
        id: "ID",
        fields: {
            extappId: { type: "number" },
            desc: { type: "string" },
            deviceNo: { type: "number" },
            validationKey: { type: "string" }
        }
    }
 }

现在,id是一个名为ID的字段,应在ID上创建此transport.create(在调用add方法之前无法设置)。

然后,您在create中设置它,您可以使用:

create: function(options){
    // Set `ID` to kendo.guid
    options.data.ID = kendo.guid();
    alert(options.data.desc);
    var localData = JSON.parse(localStorage.getItem("LsAppList"));
    localData.push(options.data);
    localStorage.setItem("LsAppList", JSON.stringify(localData)); //localStorage["LsAppList"] = JSON.stringify(localData); 
    options.success(localData);
},

在此处查看:http://jsfiddle.net/OnaBai/n7sNd/3/