2

我有剑道 ui 数据源同步。

这是链接:http: //jsbin.com/uhamer/3/

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

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

萤火虫:

类型错误:r 未定义

铬合金:

未捕获的类型错误:无法读取未定义的属性“数据”

我在这里做错了什么?

谢谢。

4

1 回答 1

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,一个是 DB 行的 ID(Kendo 期望指定的 ID 列是唯一的 DB 行 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,你可以在这里查看。现在,当单击“发送数据”按钮时,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,因此每次单击“发送数据”时,它都会继续发送该记录及以上)

于 2013-06-07T16:12:37.000 回答