4

モデルのフィールド get/set をインターセプトして、値が表示される前とモデルに格納される前に値を変換できるようにします。この場合、uriencoded データをモデルに格納したいのですが、デコードされた値を表示します。

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

これに最適な方法は何ですか?convert、ところで、悪い選択のようです。2WAYでライブではありません。

4

1 に答える 1

4

注:私はこのコードをテストしていません。そのため、質問がある場合は、概念を使用して後でコメントしてください。

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

このフレームワークは初めてなので、Modelクラスで別のクラスを拡張する場合に備えて、convert関数で「this.self」表記を使用する方法がわかりません。たとえば、Employeeクラスでデフォルト値が定義されておらず、別のクラス(たとえば、Employeeなど)から継承しているが、Employeeコンストラクターがそのプロパティを設定している場合、スーパークラス(ベースデータをエンコードするときのクラスまたは親クラス)コンストラクタ。現在、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');

変換に関する注意:変換関数のシグネチャの下に定義されているフィールドを参照している場合、コードはそれを認識せず、値を取得できません。

または、カスタムクラスを持っているが、モデルクラスを使用していない場合...

今夜、私はExtJSでちょっといいものについても読みました。彼らはExtJS4に自動ゲッターとセッターを追加しました。新しいバージョンのフレームワークは、プロパティの前に「get」、「set」、「reset」、または「apply」を自動的に付け、プロパティの最初の文字を「定義したクラスのconfig"プロパティ。

通常のJavaScriptでは、実際のクラスはありませんが、Senchaにより、クラスの定義( "define"関数を使用)と、ユーザー定義クラスのオブジェクトインスタンスをインスタンス化する機能が可能になりました。

たとえば、次のクラスが定義されているとします。

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

提案しているロジックで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
  }
});
于 2012-04-29T07:57:06.360 に答える