2

ExtJs 4の下にストアがある場合、同期が発生した後、新しく追加されたレコードからIDを取得するにはどうすればよいですか?

たとえば、PersonStore自動同期を設定していて、ユーザーが入力したフォームに基づいて新しい人を追加する場合、次のようにして新しいレコードをストアに追加できます。

var values = button.up('form').getForm().getValues(),
    store = Ext.StoreMgr.lookup('PersonStore'),
    result;

result = store.add(values);

autosyncがtrueに設定されているため、これにより新しい値がバックエンドに送信され、そこでIDが割り当てられます。次に、バックエンドは、新しく作成されたレコードのIDでクライアントに応答します。

クライアント側のコードでこの新しく作成されたレコードのIDを取得するにはどうすればよいですか?結果にはそれが含まれると思っていましたが、結果にはまだidがnullに設定されています。

4

1 に答える 1

8

サーバー側で 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);

},
于 2012-08-08T17:44:49.513 に答える