我有剑道 ui 数据源同步。
这是链接:http: //jsbin.com/uhamer/3/
单击列表时,文章将显示在网格列表中(向下),然后如果再次单击同一文章,它将增加数量+1
。在应该同步的新数据源中,schema.model.id
设置为id
.
当我单击Send data
按钮时,它显示错误。
萤火虫:
类型错误:r 未定义
铬合金:
未捕获的类型错误:无法读取未定义的属性“数据”
我在这里做错了什么?
谢谢。
我有剑道 ui 数据源同步。
这是链接:http: //jsbin.com/uhamer/3/
单击列表时,文章将显示在网格列表中(向下),然后如果再次单击同一文章,它将增加数量+1
。在应该同步的新数据源中,schema.model.id
设置为id
.
当我单击Send data
按钮时,它显示错误。
萤火虫:
类型错误:r 未定义
铬合金:
未捕获的类型错误:无法读取未定义的属性“数据”
我在这里做错了什么?
谢谢。
我不确定这是否是您的错误的一部分,但是对于 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,因此每次单击“发送数据”时,它都会继续发送该记录及以上)