使用ExtJS 4的动态模型

时间:2011-04-22 00:49:16

标签: extjs extjs4

使用ExtJS 3.x,我能够使用商店的“fields”属性,但似乎ExtJS 4我必须绝对使用模型。这很好,但在我的情况下,它不是静态模型,我需要动态定义字段,有时需要更改它们。

我可以重新创建一个模型,但我需要使用不同的名称,因为它显然无法修改现有的模型,也不能删除它。如果我尝试使用具有相同名称的Ext.regModel,则ExtJS崩溃。

感谢您的帮助!

3 个答案:

答案 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 JS 4文档:

  

这可以用来代替   指定模型配置。该   字段应该是一组   Ext.data.Field配置对象。   商店会自动创建一个   Ext.data.Model包含这些字段。在   一般这个配置选项   应该避免,它存在于   向后兼容的目的。   对于任何更复杂的事情,例如   指定特定的id属性或   关联,一个Ext.data.Model应该   为模型定义和指定   配置。

所以要小心 - Sencha可能会在将来删除它。