【问题标题】:In ExtJs, how do I get an id after syncing a record to the store?在 ExtJs 中,如何在将记录同步到商店后获取 id?
【发布时间】:2012-08-05 18:36:45
【问题描述】:

如果我在 ExtJs 4 下有一个 store,我如何在同步发生后从新添加的记录中获取 id?

例如,如果我将PersonStore 设置为自动同步,并且我根据用户填写的表格添加了一个新人,我可以通过执行以下操作将新记录添加到商店;

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

result = store.add(values);

由于 autosync 设置为 true,这会将新值发送到为其分配 id 的后端。然后后端用新创建的记录的 id 响应客户端。

如何在客户端代码中获取这条新创建记录的 id? 我曾假设 result 会包含它,但 result 仍然将 id 设置为 null。

【问题讨论】:

    标签: extjs extjs4 store


    【解决方案1】:

    当服务器端设置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);
    
    },
    

    【讨论】:

    • 你好 :) 我想我的问题不清楚,所以我更新了它以澄清。服务器正确返回了新创建的 id,但是在客户端如何检索新创建的 id?
    • 这是自动发生的,只要满足一些条件。您能否提供发送到服务器的请求和服务器响应。我认为你没有玩过 idProperty,并且 id 字段是id
    • 等一下。你的意思是像aRecord.get(“id”)吗?您可以收听存储写入事件并检查aOperation.response.result
    • 是的,这看起来就是我要找的东西。您能否在答案中对此进行扩展?那个对象看起来有我需要的东西。不知道它是如何到达我的控制器的。 (其实我可能说得太早了,我在响应文本中看到了 id,我想我可以从那里解析 JSON,但我可能只是缺少一个更方便的方法)
    • 找到了在我的控制器中获取监听器的答案,stackoverflow.com/questions/7193392
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2019-02-19
    • 2011-12-14
    • 2012-02-25
    • 1970-01-01
    • 2011-12-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多