Ext JS 4.2:为所有AJAX请求添加“Source Call”参数
嘿,针对你这个给不同区域的工时修改请求加标识的需求,我整理了几个实用方案,结合你已经尝试的思路,还有更贴合Ext框架设计的做法:
方案1:完善Ext.data.Connection的全局重写
你已经开始尝试重写Ext.data.Connection的request方法了,其实可以在这个逻辑里加入判断,给你的工时模块请求精准注入参数,而不会影响其他无关请求。示例代码如下:
Ext.data.Connection.override({ request: function(options) { // 先继承原方法的基础配置 options = this.callParent(arguments); // 给你的工时相关Store/Model加个标识,用来区分请求来源 if (options.store && options.store.isTimeSheetStore) { // 从Store实例上取预先设置的区域标识 options.params = Ext.apply(options.params || {}, { sourceRegion: options.store.regionKey }); } // 如果是Model直接发起的请求,也可以用同样的逻辑判断 else if (options.model && options.model.isTimeSheetModel) { options.params = Ext.apply(options.params || {}, { sourceRegion: options.model.regionKey }); } return options; } });
使用的时候,给每个区域的Store实例加自定义标识:
// 第一个区域的Store var region1Store = Ext.create('YourTimeSheetStore', { isTimeSheetStore: true, regionKey: 'workspace1' // 自定义区域标识,后端用这个识别来源 }); // 另外两个区域的Store同理,设置不同的regionKey即可
方案2:给Store的Proxy直接配置参数(更推荐)
其实不需要全局重写Connection,直接给每个区域的Store的Proxy添加extraParams,或者通过beforeload事件动态注入参数,这样针对性更强,不会干扰其他请求:
// 创建Store时直接固定区域参数 var region2Store = Ext.create('YourTimeSheetStore', { proxy: { type: 'ajax', url: '/your-timesheet-controller', extraParams: { sourceRegion: 'workspace2' // 直接把区域标识作为固定参数 }, reader: { type: 'json' } } }); // 如果需要动态获取区域标识(比如从组件上下文取),用beforeload事件 region2Store.on('beforeload', function(store, operation) { // 合并原有参数和区域标识 operation.setParams(Ext.apply(operation.getParams() || {}, { sourceRegion: 'workspace2' })); });
这个方案的优势是精准可控,只给你的工时修改区域的请求加参数,完全符合Ext组件化的设计思路,后期维护也更清晰。
方案3:给Model注入参数(适用于Model直接操作数据的场景)
如果你的工时修改操作是通过Model的save、load等方法发起的,可以给Model的Proxy配置参数,或者重写getProxy方法动态注入:
Ext.define('YourTimeSheetModel', { extend: 'Ext.data.Model', fields: ['id', 'hours', ...], proxy: { type: 'ajax', url: '/your-timesheet-controller' }, // 重写getProxy方法,动态注入区域参数 getProxy: function() { var proxy = this.callParent(arguments); // 从Model实例的自定义属性中获取区域标识 if (this.regionKey) { proxy.setExtraParam('sourceRegion', this.regionKey); } return proxy; } }); // 创建Model实例时设置区域标识 var region3Model = Ext.create('YourTimeSheetModel', { regionKey: 'workspace3' }); region3Model.save(); // 此时请求会自动带上sourceRegion=workspace3
方案对比
- 方案1:全局生效,适合所有工时相关请求都要加参数的场景,但要注意做好判断逻辑,避免影响其他无关请求。
- 方案2:最推荐,组件级别的配置,精准度高,代码维护起来更直观。
- 方案3:适合用Model直接处理数据的场景,和Store方案逻辑类似,只是载体换成了Model。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

