2013-06-21 104 views
1

定义模型的正常方式是如下:有没有办法在函数中定义模型字段?

Ext.define('App.MyModel', { 
    extend: 'Ext.data.Model', 

    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'} 
    ] 
}); 

是否有指定一个init型方法内的字段(也许所有配置属性),类似于一个组件的配置如何能的方式在initComponent()中设置?

为了做某些重复属性设置本地变量等操作,具备此功能将会非常有用。

回答

1

您可以在Javascript中随意定义一个函数!

Ext.define('App.MyModel', { 
    extend: 'Ext.data.Model', 

    fields: function() { 
     return [ 
      {name: 'id', type: 'int'}, 
      {name: 'name', type: 'string'} 
     ]; 
    }() // important: run it immediately! 
}); 
+0

简单而辉煌。 – jacob

0

你也可以在initComponent中做这样的事情。我有时会在组件中创建存储时传递变量,这取决于我是否希望商店自动加载。

Ext.define('App.MyModel', { 
    extend: 'Ext.data.Model', 
    initFields: function(fieldType) { 
     return [ 
      {name: 'id', type: fieldType}, 
      {name: 'name', type: fieldType} 
     ]; 
    }, 
    initComponent: function() { 
     var me = this; 

     Ext.apply(me, { 
      fields: me.initFields('string') 
     }); 
     me.callParent(); 
    } 
}); 
+1

模型不是组件,所以'initComponent'永远不会被调用。此外,模型字段是静态属性,即给定模型类的所有实例必须共享相同的字段。你真的不应该在实例级别覆盖它。 – rixo

+0

你完全正确的initComponent。我只是以另一种方式给出了一个例子,这可以做到。我给出的例子并没有覆盖任何静态。所有initFields()都会根据字段数组设置一些属性。是的,它在initComponent中,但是如果你扩展了一个你不想让某些东西能够被改变的类,那么在实例层次上覆盖就没有问题。 – radtad

+0

对不起,是的,它重写了这种方式提供给实例的任何静态信息。但是如果你只是要重写字段,扩展Model类的意义何在?如果你真的想要,你可以将this.fields传递给initFields(),然后在字段上执行一些代码并返回它们,然后将字段设置为字段:me.initFields(this.fields),那么将不会完全忽略静态。 – radtad

相关问题