2012-04-27 49 views
4

我想攔截模型中的字段get/set,以便在顯示之前以及在模型存儲之前將值轉換。在這種情況下,我想在模型中存儲未編碼的數據,但顯示解碼值。覆蓋ExtJS模型獲取器和設置器的最佳實踐

當我直接覆蓋get/set方法時,我發現它們正在被代理用來將原始數據放入模型中。我不想重寫這個過程,我甚至不知道如何判斷它是否是代理加載模型或用戶界面。

這是最好的方法是什麼?轉換,順便說一句,似乎是一個糟糕的選擇。它不是雙向的和生活的。

+1

'convert()'_is_雙向方法。我使用它來例如將十進制顏色代碼來回轉換爲十六進制。 – sha 2012-04-27 23:27:39

+0

只是所以我明白了......(1)當檢索數據時,您在ajax獲取之前將數據編碼到服務器上,然後在將數據顯示給最終用戶之前對其進行解碼? (2)在URL中傳遞數據時,您使用數據進行編碼,然後在Ext JS中解碼? (3)保存數據時,您有Ext JS編碼,然後在存儲之前傳遞給服務器並解碼? – MacGyver 2012-04-28 22:57:25

+0

如何轉換2路功能?它在我看來只是在某些東西正在從記錄中讀取值時才被調用,即。 myRec.get( 'FIELD1')。是否有一個轉換等價於在寫操作期間被調用,即。 myRec.set('field1','新值')? – Paul 2012-04-29 15:59:52

回答

4

注意:我沒有測試過這個代碼,因此如果您有任何問題,請使用這些概念和評論。

當您爲數據實體定義Ext.data.Model類(對於Ext JS 3使用Ext.data.Record)時,請將convert函數作爲Ext.data.Field屬性實例的一部分添加。如果你願意,這可以在所有領域完成,但可能不推薦。

我是新來的這個框架,所以我不知道該怎麼做的一件事是在convert函數中使用「this.self」符號,以便在您的Model類中擴展另一個類。例如,如果您沒有在Employee類中定義的默認值,並且它從另一個類(例如Employee)繼承,但Employee構造函數設置該屬性,它將採用在超類中定義的值(base當你對數據進行編碼時,這個類或者父類是構造函數。現在,它只是獲得EmployeeDeveloper.dataValue屬性。

Ext.define('EmployeeDeveloper', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    { name: 'name', type: 'string', defaultValue: 'Paul' }, 
    { name: 'profession', type: 'string', defaultValue: 'Ext JS developer' }, 
    { name: 'salary', type: 'float', defaultValue: '95000' }, 
    { name: 'dataValue', type: 'string', 
     convert: function(value, record) { 
     // feel free to use value and record parameters in this function 
     return encodeData(record.get('dataValue')); // you may have to use the "value" parameter instead of record.get('dataValue') if referencing the field in it's own convert function (haven't tested) 
     } 
    } 
    ] 
}); 

var empDev = Ext.create(
    'EmployeeDeveloper', 
    { 
    name: 'MacGyver', 
    dataValue: 'ABC' 
    }, 
    'MacGyver', 
    123 
); 

var encodedDataValue = empDev.get('dataValue'); 

注意有關轉換:如果引用的是轉換函數簽名如下定義的字段,代碼不會知道它,將無法檢索值。

或者如果你有一個自定義的類,但不使用模型類...

今晚我也看了其他的事情在Ext JS中這是一種整齊。他們在Ext JS 4中添加了自動獲取器和設置器。新版本的框架自動爲您的屬性添加「獲取」,「設置」,「重置」或「應用」,並且將屬性的首字母大寫爲「配置「屬性您定義的類。

在常規JavaScript中,它們沒有真正的類,但Sencha使定義一個類(使用「define」函數)和實例化用戶定義類的對象實例成爲可能。

例如,假設您有以下類中定義:

Ext.define('Paul.MyClass'), { 
    extend: 'Ext.Window', 
    config: { 
    name: 'Paul' 
    } 
}); 

如果您創建對象的實例,像這樣,就自動擁有了四個功能。

var win = Ext.create('Paul.MyClass'); // create instance of MyClass object 
var myName = win.getName(); // get name 
win.setName('MacGyver'); // set name 
win.resetName(); // this resets the value back to the default value ('Paul') 
win.applyName(); // this calls custom code 
win.show(); 

我建議用您建議的邏輯覆蓋apply *方法。然後調用win.get *();之後才能獲得新的價值。對計劃編碼的每個字段使用額外的編碼字段可能是明智的,所以每次在代理和/或存儲中訪問(獲取或設置)數據時,都不必操作屬性。

Ext.define('Paul.MyClass'), { 
    extend: 'Ext.Window', 
    config: { 
    name: 'Paul', 
    dataValue: 'non encoded value of your data' 
    } 
    applyName: function(title) { 
    this.name = this.name + ' ' + title; // custom logic goes here 
    } 
    applyDataValue: function(encodeKey) { 
    // get the encoded data value 
    this.self.dataValue = 'encoded data value'; // custom logic goes here 
    } 
}); 
+0

我使用的是ExtJS 4.1以及Sencha Touch 2.0 - 所以兩者都有自動獲取器和設置器。關於轉換,仍然不確定它如何幫助寫入,它似乎只在轉換讀取時很有用。也許我可以重寫getter和setter,但是在我看來,好像getter和setter在加載期間被稱爲EVEN。 model.add(newRec)操作,這對我沒有好處。 – Paul 2012-04-29 16:04:15

+0

我還沒有在Ext JS中進行編程......這個週末剛做了一些小部件,並且一直在閱讀關於這個主題的書。我剛剛找到了一份工作(入門級),我將在這裏爲當地的診所開發一個數據倉庫報告工具,這樣我就可以快速學習。如果我在本書中遇到一些信息或在線閱讀,我會回覆你。您可能需要在sencha.com論壇上發佈有關此信息的問題。 – MacGyver 2012-04-29 18:51:20

+0

什麼是model.add(newRec)沒有做? – MacGyver 2012-04-29 18:59:31