按钮上的Kendo UI dataSource同步

时间:2013-06-07 13:59:36

标签: kendo-ui datasource kendo-grid

我有kendo ui数据源同步。

以下是链接:http://jsbin.com/uhamer/3/

当您点击列表时,文章将显示在网格列表中(向下),然后如果您再次单击同一篇文章,它将增加数量+1。 在应该同步的新数据源中,schema.model.id设置为id

当我点击Send data按钮时,它会显示错误。

萤火虫:

  

TypeError:r未定义

铬:

  

未捕获的TypeError:无法读取未定义的属性“数据”

我在这里做错了什么?

感谢。

1 个答案:

答案 0 :(得分:4)

我不确定这是否是您错误的一部分,但是对于Kendo UI DataSource,如果其ID列设置为默认值(0,因为它是数字列),它只会将记录视为“新” 。当你将行复制到新的DataSource时,你也在复制ID,所以现在Kendo认为服务器已经知道了这个记录,因为它有一个ID。 您可以通过向网格的DataSource添加记录,然后在控制台中运行此JS来看到这一点:

gridNewData.data()[0].isNew(); // returns false because the id column is not 0

当您致电.sync()时,它会查找要推送到服务器的新记录,但却找不到。

您可能需要考虑在此处使用2个不同的ID;一个是文章的ID,一个是数据库行的ID(剑道期望指定的ID列是唯一的数据库行ID)

例如:

var gridNewData = new kendo.data.DataSource({
  ...
  schema: {
    model: {
      id: "id",
      fields: {
        id: { type: "number" }, // unique DB row ID
        articleid: { type: "number" }, // article's ID
        name: { type: "string" },
        quantity: { type: "number" },
        price: { type: "string" }
      }
    }
  }
  ...
});

然后将文章的ID复制到网格的文章ID:

  if (have_in === false) {
    gridData.add({
      id: 0, // leave this set to 0 or undefined, so Kendo knows it is new.
      articleid: addData.id, // copy article's id to new row's articleid
      name: addData.name,
      quantity: 1,
      price: addData.price.toFixed(2),
    });
  }

我编辑了你的jsbin和you can view it here。现在,当单击“发送数据”按钮时,Kendo将执行JSON数据的POST:

[{"articleid":1,"name":"Article 1","quantity":2,"price":"20.00","id":0}]

另请注意,在服务器端,服务器应将此新记录插入到数据库中,然后使用相同记录的JSON进行响应,但将“id”设置为非零值。例如,如果服务器对表执行SQL INSERT,那么该表可能会为ID列生成某种自动生成的序列,因此如果它是使用ID 123创建的,那么服务器应该发送带有数据的HTTP响应:

[{"articleid":1,"name":"Article 1","quantity":2,"price":"20.00","id":123}]
然后,Kendo DataSource将对HTTP响应进行取消,获取该id:123,并更新DataSource中先前添加的记录,使其ID为123.从那时起,记录不再是“新”,因为其ID不是0或未定义,因此对.sync()的其他调用不会尝试再次向服务器发送相同的记录。

(如果服务器没有发送为新记录设置了id的响应,那么Kendo将保留记录的id,并将DataSource设置为0,因此每次单击“发送数据”时它将继续发送记录一遍又一遍)