2

2 日間の苦労の末、Ext.data.Store機能する独自のクラスを作成しました (以下のコードを参照)。

プロキシとそのライターのすべての構成が考慮されていても、構成writeAllFields: trueは無視され、変更された値のみが送信されることに注意してください (これは私にとって大きな問題です)。

そこで、この (巨大な) 問題を回避するために、送信されるレコードに常に定義済みの値を追加したいと思います (常に 1 つの値で、 のようなものですid_partner: 3)。セキュリティ上の理由からこれが必要です。

Ext.define('Ext.data.StoreHandleErrors', {
    extend: 'Ext.data.Store',
    alias: 'data.storehandleerrors',

    constructor: function(config) {
        config.autoLoad= true;
        config.autoSync= true;
        config.proxy.type= 'ajax';
        config.proxy.reader= {
            type: 'json',
            successProperty: 'success',
            root: 'data',
            messageProperty: 'message'
        };
        config.proxy.writer= {
            type: 'json',
            writeAllFields: true,
            root: 'data'
        };
        config.proxy.listeners= {

            exception: function(proxy, response, operation) {
                /* Code to handle exception */
            }
        };
        this.callParent([config]);
        this.on(
            'write',
            function(store, operation) {
                /* Code to show how the write op. went */
            },
            this
        );
        this.on(
            'beforesync',
            function(objects_to_sync, opts) {
                /* Code to add a pre-defined value to be sent: "id_partner: 3" */
            },
            this
        );
    }
});

どうすればこれを行うことができますか?

4

2 に答える 2

1

これが機能する私のコードです。これはハックですが、ExtJS 4.0.7 と ExtJS 4.1 ベータ版の両方で動作します。

Ext.define('Ext.data.StoreHandleErrors', {
    extend: 'Ext.data.Store',
    alias: 'data.storehandleerrors',

    constructor: function(config) {
        /* (!!) proxy properties overwrite */
        config.autoLoad= true;
        config.autoSync= true;
        config.proxy.type= 'ajax';
        config.proxy.reader= {
            type: 'json',
            successProperty: 'success',
            root: 'data',
            messageProperty: 'message'
        };
        config.proxy.writer= {
            type: 'json',
            writeAllFields: true,
            root: 'data'
        };
        config.proxy.listeners= {

            exception: function(proxy, response, operation) {
                /* generic exception handling here */
            }
        };
        this.callParent([config]);
        this.on(
            'add',
            function(store, records, index, eOpts) {
                /* 27/04/2012 (!!) Hack: force property on all records */
                for (var i = 0; i <records.length; i++) {
                    records[i].data.id_partenaire=this.idPartenaire;
                };
            },
            this
        );
        this.on(
            'beforesync',
            /* 27/04/2012 (!!) Hack: force property on all records to false
             * and then ExtJs sees it's not the same so update
             * the value accordingly
             */
            function(sync, opts) {
                if (typeof sync.create!='undefined') {
                    for (var i = 0; i <sync.create.length; i++) {
                        sync.create[i].modified.id_partenaire=false;
                    };
                }
                if (typeof sync.update!='undefined') {
                    for (var i = 0; i <sync.update.length; i++) {
                        sync.update[i].modified.id_partenaire=false;
                    };
                }
            },
            this
        );
        /* (!!) remember the property (it's not copied
         * when calling this.callParent([config]); )
         */
        this.idPartenaire=config.idPartenaire;
    }
});
于 2012-04-28T17:02:41.600 に答える