ExtJS6.5中如何从服务器动态设置数据模型默认值?
嘿,作为ExtJS新手,你这个问题太典型了——从静态默认值切换到动态获取,确实会纠结选哪种方案更合适。我来帮你拆解下两种思路的优劣,再给你推荐最适合的方向:
方案一:使用Proxy的transform函数
Proxy的transform函数主要用来在数据请求的响应阶段处理返回结果,刚好可以用来把服务器返回的entityName/def结构转换成Model能直接使用的默认值。
怎么实现?
你可以给对应实体的Model配置一个专门的Proxy,用transform把服务器返回的默认值映射成Model字段的结构:
Ext.define('MyApp.model.MyEntity', { extend: 'Ext.data.Model', fields: [/* 你的字段配置 */], proxy: { type: 'ajax', url: '/api/entityName/def', // 对应服务器的默认值接口 reader: { type: 'json' }, transform: { response: function(response) { // 假设服务器返回格式是 { "def": { "fieldA": "默认值A", "fieldB": 0 } } const resData = Ext.decode(response.responseText); // 直接返回def里的键值对,作为Model的默认数据 return resData.def; } } } });
之后在弹窗里创建Model实例时,调用load方法获取默认值,再填充到表单:
const defaultRecord = Ext.create('MyApp.model.MyEntity'); defaultRecord.load({ success: function(record) { // 把加载到的默认值填充到弹窗表单 yourDialogForm.loadRecord(record); } });
优缺点
- 优点:符合ExtJS的MVC思想,把数据逻辑封装在Model层,弹窗里不用写重复的请求代码,适合通用默认值的场景。
- 缺点:如果默认值需要依赖当前上下文(比如Grid选中的行ID、当前用户权限),传递参数到Proxy会比较麻烦;而且新手可能需要花点时间理解Proxy的数据流转逻辑,调试起来不如直接写AJAX直观。
方案二:创建对话框时调用接口填充字段
这种方式更直白:在弹窗初始化(比如initComponent或者beforeShow事件)的时候,直接发AJAX请求获取默认值,然后手动设置表单字段的值。
怎么实现?
Ext.define('MyApp.view.MyEntityDialog', { extend: 'Ext.window.Window', items: [{ xtype: 'form', reference: 'entityForm', items: [/* 你的表单字段 */] }], initComponent: function() { this.callParent(arguments); // 弹窗初始化时请求默认值 Ext.Ajax.request({ url: '/api/entityName/def', success: function(response) { const defaultVals = Ext.decode(response.responseText).def; // 把默认值设置到表单 this.lookupReference('entityForm').setValues(defaultVals); }, scope: this // 确保回调里的this指向弹窗实例 }); } });
优缺点
- 优点:逻辑非常直观,新手一看就懂,调试起来也简单;如果需要给默认值接口传递上下文参数(比如
/api/entityName/def?parentId=xxx),直接在URL里加就行,毫无门槛。 - 缺点:如果有大量实体弹窗都需要这个逻辑,会出现重复代码——不过这个问题可以通过封装通用Mixin或者基类窗口解决。
给新手的推荐
如果你的默认值是通用型的(不依赖当前页面的任何上下文),而且想贴合ExtJS的MVC模式,那Proxy+transform是更优雅的选择;但如果是新手,想要快速上手、逻辑清晰,或者默认值需要动态适配场景,那方案二更适合你——毕竟它的代码流程直白,不用去理解Proxy的底层数据流转,出错了也好排查。
要是你有大量实体需要处理,还可以把默认值请求逻辑封装成通用Mixin,避免重复代码:
// 封装通用的默认值加载Mixin Ext.define('MyApp.mixin.DefaultValueLoader', { loadDefaultValues: function(entityName, formRef) { Ext.Ajax.request({ url: `/api/${entityName}/def`, success: function(response) { const defaultVals = Ext.decode(response.responseText).def; this.lookupReference(formRef).setValues(defaultVals); }, scope: this }); } }); // 在弹窗里复用Mixin Ext.define('MyApp.view.MyEntityDialog', { extend: 'Ext.window.Window', mixins: ['MyApp.mixin.DefaultValueLoader'], initComponent: function() { this.callParent(arguments); // 调用Mixin的方法加载默认值 this.loadDefaultValues('MyEntity', 'entityForm'); } });
这样既保持了代码复用,又能让新手逐步理解ExtJS的复用机制。
内容的提问来源于stack exchange,提问作者Mounir Abderrahmani
相关产品推荐
相关产品推荐

