2011-04-22 88 views
28

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

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

感谢您的帮助!

回答

20

4.1 UPDATE:

作为更新...在4.1现在是一个静态方法setFields其可用于定义模型原型字段。它在控制器的init方法中运行良好。

当我这样做时,我想在模型类中定义一些静态字段,然后设置一些动态的。不幸的是,新的setFields方法用参数替换了所有字段,但它很容易处理。

此示例使用,其中我的模型和存储被包括在MVC模式控制器的model阵列和store阵列(我提供以下所用的方便的吸气剂):

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商店是创建完全像常规,非动态模型和存储将被包括在其各自的控制器阵列中,'用户'模型仅仅缺少如上所示添加的动态字段。

+0

感谢您添加更新 – Jom 2012-05-15 11:38:16

+0

为什么不直接将新字段添加到''MixedCollection''字段?是否有'setFields'方法需要处理?我的意思是旁边创建'Field'实例,在你的情况。 – rixo 2013-07-30 20:37:59

3

下面是一个非常简单的例子。只需使用一个正常的Ext.data.Store但不是一个模式,指定的字段属性:

// 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... 
}); 

不要指定模型属性 - 它似乎会覆盖领域的财产。

我也想改变列和动态现有电网的内容:关于Ext.data.Store的“域”属性

// 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 JS的4文件:

这可能是用于代替指定模型配置的 。 字段应该是一组 Ext.data.Field配置对象。 商店将自动创建一个带有这些字段的 Ext.data.Model。在 通用这个配置选项 应该避免,它存在的目的是向后兼容。 对于任何更复杂的操作,例如 指定了一个特定的id属性或 关联,应为 配置定义并指定一个Ext.data.Model 。

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

+0

这里小心 - 如果您在商店中设置字​​段,而忽略模型,并且您有自定义ID字段,则会失败。您的商店记录将设置其Id,但无法通过getId()返回Id,因为他们不知道自定义ID。不知道这是否是一个错误,但无论如何我都会报告它http://www.sencha.com/forum/showthread.php?280160-model.getId()-with-custom-IdProperty-fails-when-and-store -fields-set-via-metaData&p = 1024289&viewfull = 1#post1024289 – HDave 2014-01-21 16:56:28

+0

这是一个为我工作的人...不得不删除“Model”,而是将其配置为hardcore .. – PedroMorgan 2014-02-05 13:36:29

17

我也进入了这个问题。我有一个服务负责从服务器获取元数据,并将模型和存储适配到这个元数据。

因此,我定义了一个空模型并将商店配置为使用此模型。

处理元数据时,我将这些新/附加字段添加到模型原型中(metaDataStore是包含元数据的存储区,模型是可以从模型管理器获取的模型):

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); 

当我然后调用使用此模型的商店的负载或创建新的模型实例时,正确处理新的字段。