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 的情况下添加到商店的记录。
  • 存储同步,因此创建请求被发送到服务器。
  • 服务器返回已发送的记录,并设置了 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 回答