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