サーバー側で ID を設定する場合、ワークフローは次のようになります。
- ID が割り当てられていないレコードがストアに追加されました。
- ストアが同期するため、Create リクエストがサーバーに送信されます。
- サーバーは、id プロパティが設定された送信済みレコードを返します。
- ExtJS は返されたレコードを確認し、ID が設定されている場合はそれをレコードに割り当てます。
ちなみに、すべての CRUD 操作では、id が一致する限り、ストア レコードはサーバーから返されたデータで更新されることに注意してください。新しく作成されたレコードの場合、ExtJS には internalId メカニズムがあり、返されたレコードが送信されたレコードであることを判断しますが、その id が設定されています。
サーバー側のコードは次のようになります。
function Create( $aRecord )
{
global $pdo;
$iInsertClause = InsertClause::FromFields( self::$persistents );
$iStatement = $pdo->prepare( "INSERT INTO Tags $iInsertClause" );
$iStatement->execute( InsertClause::ObjectToParams( $aRecord, self::$persistents ) );
// Inject the id into the record and return it in the reader's root,
// so client side record updates with the new id.
$aRecord->id = $pdo->lastInsertId();
return array(
'success' => true,
'data' => $aRecord,
);
}
次に、アプリ内でコントローラーがストア書き込みイベントにフックする必要があります。このようなもの:
init: function() {
this.getTasksStore().on({
write: this.onStoreWrite,
scope: this
});
},
そして、その関数内で、返されたレコードを調べることができます (data
リーダーのルートであると想定しています)。
onStoreWrite: function ( aStore, aOperation )
{
var iRecord = aOperation.response.result.data;
console.log(iRecord.id);
},