我想攔截模型中的字段get/set,以便在顯示之前以及在模型存儲之前將值轉換。在這種情況下,我想在模型中存儲未編碼的數據,但顯示解碼值。覆蓋ExtJS模型獲取器和設置器的最佳實踐
當我直接覆蓋get/set方法時,我發現它們正在被代理用來將原始數據放入模型中。我不想重寫這個過程,我甚至不知道如何判斷它是否是代理加載模型或用戶界面。
這是最好的方法是什麼?轉換,順便說一句,似乎是一個糟糕的選擇。它不是雙向的和生活的。
我想攔截模型中的字段get/set,以便在顯示之前以及在模型存儲之前將值轉換。在這種情況下,我想在模型中存儲未編碼的數據,但顯示解碼值。覆蓋ExtJS模型獲取器和設置器的最佳實踐
當我直接覆蓋get/set方法時,我發現它們正在被代理用來將原始數據放入模型中。我不想重寫這個過程,我甚至不知道如何判斷它是否是代理加載模型或用戶界面。
這是最好的方法是什麼?轉換,順便說一句,似乎是一個糟糕的選擇。它不是雙向的和生活的。
注意:我沒有測試過這個代碼,因此如果您有任何問題,請使用這些概念和評論。
當您爲數據實體定義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
}
});
我使用的是ExtJS 4.1以及Sencha Touch 2.0 - 所以兩者都有自動獲取器和設置器。關於轉換,仍然不確定它如何幫助寫入,它似乎只在轉換讀取時很有用。也許我可以重寫getter和setter,但是在我看來,好像getter和setter在加載期間被稱爲EVEN。 model.add(newRec)操作,這對我沒有好處。 – Paul 2012-04-29 16:04:15
我還沒有在Ext JS中進行編程......這個週末剛做了一些小部件,並且一直在閱讀關於這個主題的書。我剛剛找到了一份工作(入門級),我將在這裏爲當地的診所開發一個數據倉庫報告工具,這樣我就可以快速學習。如果我在本書中遇到一些信息或在線閱讀,我會回覆你。您可能需要在sencha.com論壇上發佈有關此信息的問題。 – MacGyver 2012-04-29 18:51:20
什麼是model.add(newRec)沒有做? – MacGyver 2012-04-29 18:59:31
'convert()'_is_雙向方法。我使用它來例如將十進制顏色代碼來回轉換爲十六進制。 – sha 2012-04-27 23:27:39
只是所以我明白了......(1)當檢索數據時,您在ajax獲取之前將數據編碼到服務器上,然後在將數據顯示給最終用戶之前對其進行解碼? (2)在URL中傳遞數據時,您使用數據進行編碼,然後在Ext JS中解碼? (3)保存數據時,您有Ext JS編碼,然後在存儲之前傳遞給服務器並解碼? – MacGyver 2012-04-28 22:57:25
如何轉換2路功能?它在我看來只是在某些東西正在從記錄中讀取值時才被調用,即。 myRec.get( 'FIELD1')。是否有一個轉換等價於在寫操作期間被調用,即。 myRec.set('field1','新值')? – Paul 2012-04-29 15:59:52