2

经过两天的努力,我制作了自己的Ext.data.Store课程(见下面的代码)。

请注意,即使考虑了代理及其编写器的所有配置,配置writeAllFields: true也会被忽略,只发送更改的值(这对我来说是个大问题)。

所以,现在,为了规避这个(巨大的)问题,我想总是为发送的记录添加一个预定义的值(它总是一个值,比如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

这是我的有效代码。这是一个 hack,但它适用于 ExtJS 4.0.7 和 ExtJS 4.1 beta。

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 回答
0

我在 ExtJs "5.1" 中发现,当模型中未指定字段类型时,即使您已将 "writeAllFields" 设置为 true,该字段也不会发送到服务器。例如,使用以下代码:

"fields:[
        {name:'commission_id', type:'int'},
        {name:'name'},
        {name:'surname', type:'auto'},
    ]"

即使没有更改,commission_id 也会被发送。姓名和姓氏如果不更改将不会发送。

于 2015-08-05T13:12:31.603 回答