9

プロトタイプを使用してフィールドを追加することで、既存のモデルを拡張しました。すべてが正常に機能し、サーバー側からデータを受信して​​クライアント側で使用できます。しかし、データを更新してサーバー側に送り返すと、「新しい」フィールドがプロキシのライターによって認識されません。

より具体的には、次のようなモデルがあります。

    Ext.define('Osgaar', {
      extend: 'Ext.data.Model',
      fields: [
        { name: 'first', type: 'string' },
        { name: 'second', type: 'string' },
        { name' 'third', type: 'string' }
      ],

      proxy: {
        type: 'rest',
        url: 'public/svcmethod',
        reader: {
          type: 'json',
          root: 'data'
        },
        writer: {
          type: 'json',
          writeAllFields: false
        }
      }
    });

私はそのようにモデルを拡張しています:

    Osgaar.prototype.fields.add({ name: 'fourth', type: 'string' });

すべての属性を転送するように設定しようとしましwriteAllFieldsたが、プロトタイプを使用して追加されたものではなく、定義されたモデルからのものだけがあります (Fiddler はそれを確認しています)。false

新しいモデルを定義せずにこれを解決する方法はありますか?

前もって感謝します。

4

2 に答える 2

12

ここでの最善の解決策は次のとおりだと思います。

Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object

Writerの実装をざっと見てみました。データを書き込むときにwrite()によって呼び出されるメソッドを次に示します。

getRecordData: function(record) {
        var isPhantom = record.phantom === true,
            writeAll = this.writeAllFields || isPhantom,
            nameProperty = this.nameProperty,
            fields = record.fields,            // <- look here
            data = {},
            changes,
            name,
            field,
            key;

        if (writeAll) {
            fields.each(function(field){
                if (field.persist) {           // <- checks the persist property!
                    name = field[nameProperty] || field.name;
                    data[name] = record.get(field.name);
                }
            });

次に、モデルが定義された後にプロトタイプに追加されたフィールドのpersistプロパティの値を確認したところ、 undefinedであることが判明しました。これは、すべてのフィールドのデフォルトやその他の有用なものを継承するExt.data.Fieldインスタンスを実際に作成しているのではなく、フィールド コレクションに単純なオブジェクトを追加しているだけだからです。Osgaar.prototype.fields は単なるMixedCollectionであり、直接操作しているため、 Ext.data.Fieldコンストラクターが暗黙的に呼び出される場所はありません。

アプリケーション ロジックでモデル フィールドをオンザフライで追加することが一般的である場合は、カスタム モデルにaddField()メソッドを実装することを検討してください (継承チェーンに別の基本クラスを作成します)。

これが役に立てば幸いです、頑張ってください!私は ExtJS をかなり長い間使用してきたので、これは私にとってクイズのようなものでした :)

于 2012-05-28T20:05:20.750 に答える
1

元の問題の別の解決策を見つけました。

モデルのプロトタイプにフィールドを追加する代わりに、次のことを行いました。

Osgaar_Temp = Osgaar;
delete Osgaar;

Ext.define('Osgaar', {
    extend: 'Osgaar_Temp',
    fields: 
    [
        { name: 'typeCategories', type: 'string' }
    ]
});

これが最善の解決策のようです。

于 2012-06-04T14:29:21.833 に答える