2013-03-19 78 views
0

我正在定義商店,我想在創建時爲其動態分配模型。因此,如果我創建DropDownStore,並且不傳遞模型配置,它需要依賴默認模型(DropDownModel)。ExtJs4如何在創建時將模型分配給商店?

這裏是我的DropDownModel + DropDownStore

Ext.define('DropDownModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'Id', type: 'int' }, 
     { name: 'Name', type: 'string' } 
    ] 
}); 
Ext.define('DropDownStore', { 
    extend: Ext.data.Store, 
    proxy: { 
     type: 'ajax', 
     actionMethods: { read: 'POST' }, 
     reader: { 
      type: 'json', 
      root: 'data' 
     } 
    }, 
    constructor: function(config) { 
     var me = this; 

     if (config.listUrl) { 
      me.proxy.url = config.listUrl; 
     } 

     me.model = (config.model) ? config.model : 'DropDownModel'; //This line creates some weird behaviour 

     me.callParent(); 

     //If the URL is present, load() the store. 
     if (me.proxy.url) { 
      me.load(); 
     } 
    } 
}); 

這是一個動態模型創建DropDownStore的:

Ext.define('RelationModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'Id', type: 'int' }, 
     { name: 'RelationName', type: 'string' }, 
     { name: 'RelationOppositeName', type: 'string' } 
    ] 
}); 

...//a random combobox 
store: Ext.create('DropDownStore', { 
    listUrl: 'someprivateurl', 
    model: 'RelationModel' 
}) 
... 

當我編輯在constructor方法行至
me.model = (config.model) ? config.model : undefined
它像動態模型預期的那樣工作,但對於默認模型不再適用。

如果我讓它成爲
me.model = (config.model) ? config.model : 'DropDownModel';
它爲默認模式,而不是針對動態模型。

如何在創建時將模型分配給商店?

回答

1
constructor: function(config) { 
    var me = this; 

    if (config.listUrl) { 
     me.proxy.url = config.listUrl; 
    } 
    me.callParent(); 

    if (config.extraFields) { 
     me.model.setFields(config.extraFields); 
    } 

    //If the URL is present, load() the store. 
    if (me.proxy.url) { 
     me.load(); 
    } 
} 

store: Ext.create('DropDownStore', { 
    listUrl: 'someprivateurl', 
    extraFields: [ 
     { name: 'Id', type: 'int' }, 
     { name: 'RelationName', type: 'string' }, 
     { name: 'RelationOppositeName', type: 'string' } 
    ] 
}),