2012-09-19 49 views
7

我有以下型號:ExtJs4模型用戶定義的ID

Ext.define('Gst.model.Order', { 
    extend: 'Ext.data.Model', 
    idProperty: 'id', 
    fields: [ 
     { name: 'id', type: 'string' } 
    ] 
});  

我的問題是,爲了模型的ID是用戶定義的。因此,代碼創建一個新的單實例,並將其插入命令店將是:

order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedvalue'}); 
store.insert(0, order); 

會發生什麼事是因爲idProperty由用戶則訂單沒有被標記爲幻影提供的,因此不考慮髒。因此,服務器不會發布POST。如果我手動設置爲幻影和骯髒的話,我可以觸發POST當我插入的順序到像店:

order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedID'}); 
order.phantom = true; 
order.setDirty(); 
store.insert(0, order); 

這將是罰款,但我的服務器端代碼使用REST控制器,並期待着POST不要在url中擁有和id。因此,儘管要求ExtJS的問題是

POST http://app.local/api/order/someuserdefinedID.json 

雖然我的服務器將查找的格式將

POST http://app.local/api/order.json 

所以我有一些了用於固定這將是創建一個訂單的唯一途徑,設置phantom = true並調用setDirty()。這將導致發佈POST,然後在我的RestProxy中重寫buildUrl:使用邏輯來測試POST請求並從url中移除idProperty。

這看起來像是一個醜陋的工作,想知道是否有更好的方法?

我想我的問題是:什麼是處理這樣的事情的最佳方式是什麼?

+0

您應該提供您正在使用的確切ExtJS版本 – sra

+1

在客戶端爲新記錄設置ID是很常見的。這通常是數據庫的工作。 – dbrin

+0

Sra:我正在使用ExtJs 4.1.1 – John

回答

1

將可能的解決方案是將order_id屬性添加到模型並將id作爲自然鍵嗎?在我看來,像對抗idProperty的方式一樣,需要做很多工作。只是我的2c。

+0

我同意約翰。雖然我是數據倉庫專家,但我會爲他的建議提出不同的條款。您應該有一個名爲id的代理鍵(唯一鍵),並在創建記錄時將其保留爲空,以避免API框架調用hack。然後添加另一個屬性,作爲自然鍵,稱爲order_id。在創建記錄期間設置order_id,並將id作爲數據庫中的身份標識,因此每次增加一個,並且不需要由用戶設置。任何應用程序的經驗法則是最終用戶不應該看到內部(唯一)標識。 – MacGyver

0

就像約翰·霍爾說的,你應該使用另一個idproperty或者重命名你的id,這樣框架(內部id)會使用一個隱含的id。

髒/幻影然後將工作和發佈將包括數據中的用戶ID,但不是記錄的關鍵。