2012-04-27 6 views
4

モデルにフィールドget/setをインターセプトして、値がモデルに格納される前に変換される前に変換できるようにしたい。この場合、私はモデルにuriencodedデータを格納したいが、デコードされた値を表示したい。ExtJSモデルゲッターとセッターをオーバーライドするベストプラクティス

私が直接get/setメソッドをオーバーライドすると、プロキシが生データをモデルに入れるために使用されていることがわかります。私はそのプロセスをオーバーライドする必要はないと私はそれがモデルまたはUIをロードするプロキシであるかどうかをどのように伝えるかもわかりません。

これにはどのような方法が最適ですか? convert、btwは貧しい選択のようです。それは双方向ではなく、生きている。

+1

'convert()' _is_双方向メソッドです。私はそれをたとえば10進カラーコードを16進数に前後に変換するために使用します。 – sha

+0

ちょうど私が理解している..(1)データを取得するとき、ajaxが取得してエンドユーザーにデータを表示する前にデコードする前に、サーバー上のデータをエンコードしていますか? (2)URLにデータを渡すときに、エンコードしてから、データを使用するときにExt JSでデコードしますか? (3)データを保存するときに、Ext JSでエンコードしてからサーバーに渡し、保存する前にデコードしますか? – MacGyver

+0

双方向関数の変換方法は?何かがレコードから値を読み込んでいるときに呼び出されるように見えます。 myRec.get( 'field1')。つまり、書き込み操作中に呼び出される変換換算が存在します。 myRec.set( 'field1'、 'new value')? – Paul

答えて

4

注:私はこのコードをテストしていないので、後でその概念とコメントを使用して質問があります。

データエンティティ用にExt.data.Modelクラスを定義する場合(Ext JSの場合はExt.data.Recordを使用)、Ext.data.Fieldプロパティインスタンスの一部としてconvert関数を追加します。これは必要な場合はすべてのフィールドで行うことができますが、おそらく推奨されません。

私はこのフレームワークには新しいので、あなたがModelクラスで別のクラスを拡張している場合には、変換関数で "this.self"表記を使用する方法がわかりません。たとえば、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'); 

変換に関する注意:あなたは変換関数署名の下に定義されたフィールドを参照している場合、コードはそれについて知ることができませんし、値を取得することができません。

ORカスタムクラスを持っていますが、モデルクラスを使用しない場合...私はまた、一種のきちんとしたのExt JSでだ何か他のものについて読ん

今夜。 Ext JS 4でオートゲッターとセッターを追加しました。フレームワークの新しいバージョンは、プロパティに "get"、 "set"、 "reset"、または "apply"という接頭辞を自動的に付加し、あなたの定義されたクラスの "設定"プロパティ

通常のJavaScriptでは、実際のクラスはありませんが、Senchaではクラスを定義することができ、ユーザー定義クラスのオブジェクトインスタンスをインスタンス化することができます。例えば

、あなたが定義された以下のクラスがあるとします。

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

あなたがそうのようなあなたのオブジェクトのインスタンスを作成する場合は、自動的に4つの機能へのアクセス権を持っています。

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

私はあなたが示唆されているロジックを適用*メソッドをオーバーライドすることをお勧めしたいです。次に、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を使用しています - 両方ともオートゲッターとセッターを持っています。変換に関しては、それが書き込みにどのように役立つのかまだ分かりませんが、読み込みを変換するのに役立つようです。おそらく私はゲッターとセッターをオーバーライドすることができますが、ゲッターとセッターはローディング中にEVENと呼ばれているように私に見えました。 model.add(newRec)操作は、私には良いことではありません。 – Paul

+0

私はExt JSでプログラミングしていません。今週末にウィジェットをいくつか作って、その本を読んでいます。私はちょうど地元のクリニックのためのこのフレームワークを持つデータウェアハウスのレポートツールを開発する予定の仕事(入門レベル)を持っていますので、私はすぐに学びます。この本の一部の情報を読んだり、オンラインで読むと、私はあなたに返信します。この情報を使用してsencha.comフォーラムに質問を投稿したい場合があります。 – MacGyver

+0

model.add(newRec)とは何ですか? – MacGyver

関連する問題