使用ExtJS 3.x,我能够使用商店的“fields”属性,但似乎ExtJS 4我必须绝对使用模型。这很好,但在我的情况下,它不是静态模型,我需要动态定义字段,有时需要更改它们。
我可以重新创建一个模型,但我需要使用不同的名称,因为它显然无法修改现有的模型,也不能删除它。如果我尝试使用具有相同名称的Ext.regModel,则ExtJS崩溃。
感谢您的帮助!
答案 0 :(得分:20)
4.1更新:
作为更新......在4.1中,现在有一个静态方法setFields
,可用于定义模型原型字段。它在控制器的init方法中运行良好。
当我这样做时,我想在模型类中定义一些静态字段,然后更动态地设置一些。不幸的是,新的setFields
方法用参数替换所有字段,但它很容易处理。
此示例使用MVC模式,其中我的模型和存储包含在控制器的model
数组和store
数组中(为我提供了下面使用的方便的getter):
Ext.define('ST.controller.Main', {
extend: 'Ext.app.Controller',
models: ['User', 'Reference'],
stores: ['CurrentUser', 'PermissionRef'],
views: ['MainPanel'],
init: function() {
var me = this;
me.getPermissionRefStore().on('load', function(store, records) {
var model = me.getUserModel();
// this returns the static fields already defined
// in my User model class
fields = model.prototype.fields.getRange();
// add the permission options (dynamic fields) to the static fields
Ext.each(records, function(permission) {
fields.push({name: permission.get('name'), type: 'bool'});
});
// 4.1 method to update the User model fields
model.setFields(fields);
// now load the current user (it will use the updated model)
me.getCurrentUserStore().load();
});
}
});
User
模型和CurrentUser
存储的创建方式与常规的非动态模型完全相同,存储将包含在各自的控制器数组中,“用户”模型只是缺少动态字段如上所示添加。
答案 1 :(得分:17)
我也遇到了这个问题。我有一个服务,负责从服务器获取元数据,并使模型和存储适应这个元数据。
因此,我定义了一个空模型,并将商店配置为使用此模型。
当处理元数据时,我将新的/附加字段添加到模型的原型中(metaDataStore是包含元数据的存储,模型是可以从模型管理器获得的模型):< / p>
var fields = [];
metaDataStore.each(function(item) {
fields.push(Ext.create('Ext.data.Field', {
name: item.get('field')
}));
});
model.prototype.fields.removeAll();
model.prototype.fields.addAll(fields);
当我使用此模型在商店上调用load或创建新模型实例时,将正确处理新字段。
答案 2 :(得分:3)
这是一个非常简单的例子。只需使用普通的Ext.data.Store,而不是模型,指定fields属性:
// you can specify a simple string ('totally')
// or an object with an Ext.data.Field ('dynamic')
var fields = ['totally', {name : 'dynamic', type : 'string'}];
var newStore = new MyApp.store.Object({
fields : fields
// other options like proxy, autoLoad...
});
不要指定模型属性 - 它似乎会覆盖fields属性。
我还想动态更改现有网格的列和内容:
// reconfigure the grid to use the new store and other columns
var newColumns = [
{header: 'Totally', dataIndex: 'totally'},
{header: 'Dynamic', dataIndex: 'dynamic'}
];
myGrid.reconfigure(newStore, newColumns);
关于Ext.data.Store的
这可以用来代替 指定模型配置。该 字段应该是一组 Ext.data.Field配置对象。 商店会自动创建一个 Ext.data.Model包含这些字段。在 一般这个配置选项 应该避免,它存在于 向后兼容的目的。 对于任何更复杂的事情,例如 指定特定的id属性或 关联,一个Ext.data.Model应该 为模型定义和指定 配置。
所以要小心 - Sencha可能会在将来删除它。