2

私は剣道UIデータソース同期を持っています。

リンクは次のとおりです。http://jsbin.com/uhamer/3/

リストをクリックすると記事がグリッドリスト(下)に表示され、同じ記事をもう一度クリックすると数量が増え+1ます。同期する必要があるその新しい dataSource では、schema.model.idが に設定されidます。

ボタンをクリックするSend dataと、エラーが表示されます。

ファイアーバグ:

TypeError: r は定義されていません

クロム:

キャッチされていない TypeError: 未定義のプロパティ 'データ' を読み取ることができません

ここで何が間違っていますか?

ありがとう。

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 を持つことを検討することをお勧めします。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 に設定したままにするため、[データを送信] をクリックするたびにそのレコードを送信し続けます。オーバー)

于 2013-06-07T16:12:37.000 に答える