2012-08-08 104 views
2

如果我在ExtJs 4下有一個商店,如何在同步發生後從新添加的記錄中獲得一個id?在ExtJs中,如何在將記錄同步到商店後獲取ID?

例如,如果我將PersonStore設置爲自動同步,並根據用戶填寫的表單添加新用戶,則可以通過執行以下操作將新記錄添加到商店中;

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

result = store.add(values); 

由於自動同步設置爲true,它將通過新值向後端分配一個id。後端然後用新創建的記錄的ID響應客戶端。

如何在客戶端代碼中獲取此新創建記錄的ID?我假設結果會包含它,但結果仍然有id設置爲null。

回答

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); 

}, 
+0

您好再次:)我想我是在我的問題不清楚,所以我已經更新以澄清。服務器正確地返回新創建的ID,但是在客戶端如何檢索新創建的ID? – 2012-08-08 17:50:12

+0

這是自動發生的,因爲有幾件事情是滿意的。你能否提供發送給服務器的請求和服務器響應?我認爲你沒有使用idProperty,並且id字段是'id'。 – Izhaki 2012-08-08 19:01:01

+1

等一下。你的意思是像aRecord.get(「id」)?你可以聽商店寫事件,並檢查'aOperation.response.result' – Izhaki 2012-08-08 19:03:23