29

ExtJS 3.xでは、ストアの「fields」プロパティを使用できましたが、ExtJS 4では、絶対にモデルを使用する必要があるようです。それは問題ありませんが、私の場合、静的モデルではないため、フィールドをその場で定義し、場合によっては変更する必要があります。

モデルを再作成することはできますが、既存のモデルを変更したり、削除したりすることは明らかに不可能であるため、別の名前を使用する必要があります。同じ名前のExt.regModelを使用しようとすると、ExtJSがクラッシュします。

ご協力いただきありがとうございます!

4

3 に答える 3

20

4.1 更新:

更新として... 4.1 にはsetFields、モデル プロトタイプ フィールドの定義に使用できる静的メソッドが追加されました。コントローラーの init メソッドでうまく機能します。

これを行ったとき、いくつかの静的フィールドをモデル クラスで定義してから、さらに動的に設定したいと考えました。残念ながら、新しいsetFieldsメソッドはすべてのフィールドを引数に置き換えますが、扱いは簡単でした。

modelこの例では、モデルとストアがコントローラーの配列と配列に含まれる MVC パターンを使用しstoreます (以下で使用する便利なゲッターを提供します)。

Ext.define('ST.controller.Main', {
    extend: 'Ext.app.Controller',

    models: ['User', 'Reference'],

    stores: ['CurrentUser', 'PermissionRef'],

    views: ['MainPanel'],

    init: function() {
        var me = this;

        me.getPermissionRefStore().on('load', function(store, records) {
            var model = me.getUserModel();
                // this returns the static fields already defined 
                // in my User model class
                fields = model.prototype.fields.getRange();

            // add the permission options (dynamic fields) to the static fields
            Ext.each(records, function(permission) {
                fields.push({name: permission.get('name'), type: 'bool'});
            });

            // 4.1 method to update the User model fields
            model.setFields(fields);

            // now load the current user (it will use the updated model)
            me.getCurrentUserStore().load();

        });

    }

});

Userモデルとストアは、CurrentUser通常の非動的モデルとストアとまったく同じように作成され、それぞれのコントローラー配列に含まれます。「ユーザー」モデルには、上記のように追加された動的フィールドが欠落しています。

于 2012-05-14T17:53:48.347 に答える
17

私もその問題に入りました。サーバーからメタデータをフェッチし、モデルとストアをこのメタデータに適応させるサービスがあります。

したがって、空のモデルを定義し、このモデルを使用するようにストアを構成しました。

メタ データが処理されると、次のようにモデルのプロトタイプに新規/追加フィールドを追加します (metaDataStore はメタ データを含むストア、モデルはモデル マネージャーから取得できるモデルです)。

var fields = [];
metaDataStore.each(function(item) {
    fields.push(Ext.create('Ext.data.Field', {
        name: item.get('field')
    }));
});
model.prototype.fields.removeAll();
model.prototype.fields.addAll(fields);

次に、このモデルを使用してストアでロードを呼び出すか、新しいモデル インスタンスを作成すると、新しいフィールドが正しく処理されます。

于 2011-08-24T15:52:27.983 に答える
3

これは非常に簡単な例です。通常の Ext.data.Store を使用するだけですが、モデルの代わりに fields プロパティを指定します:

// you can specify a simple string ('totally')
// or an object with an Ext.data.Field ('dynamic')
var fields = ['totally', {name : 'dynamic', type : 'string'}];
var newStore = new MyApp.store.Object({
  fields : fields
  // other options like proxy, autoLoad...
});

モデル プロパティを指定しないでください。フィールド プロパティをオーバーライドするようです。

また、既存のグリッドの列とコンテンツを動的に変更したいと考えていました。

// reconfigure the grid to use the new store and other columns
var newColumns = [
  {header: 'Totally', dataIndex: 'totally'},
  {header: 'Dynamic', dataIndex: 'dynamic'}
];
myGrid.reconfigure(newStore, newColumns);

Ext.data.Storeの "fields" プロパティに関する Ext JS 4 ドキュメントから:

これは、モデル コンフィギュレーションを指定する代わりに使用できます。フィールドは、Ext.data.Field 構成オブジェクトのセットである必要があります。ストアは、これらのフィールドを使用して Ext.data.Model を自動的に作成します。一般に、この構成オプションは避けるべきであり、下位互換性のために存在します。特定の id プロパティや関連付けを指定するなど、より複雑なものについては、Ext.data.Model を定義してモデル構成に指定する必要があります。

注意してください - Sencha は将来的に削除するかもしれません。

于 2011-06-26T22:14:56.697 に答える