これがエラーの一部であるかどうかはわかりませんが、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 を持つことを検討することをお勧めします。1 つは記事の ID、もう 1 つは 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}]
また、サーバー側では、サーバーはこの新しいレコードを DB に挿入し、同じレコードの 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 に設定したままにするため、[データを送信] をクリックするたびにそのレコードを送信し続けます。オーバー)