Javascript 组合框在使用模型数据更新表单后存储加载
我注意到有很多方法可以用数据填充表单。 我想用extjs4mvc风格来做。 然而,我现在看到一些不希望发生的事情 我的表单有一个绑定到商店的组合框。 在用模型数据填充表单后,将填充存储 我的观点/形式Javascript 组合框在使用模型数据更新表单后存储加载,javascript,extjs,extjs4,extjs-mvc,Javascript,Extjs,Extjs4,Extjs Mvc,我注意到有很多方法可以用数据填充表单。 我想用extjs4mvc风格来做。 然而,我现在看到一些不希望发生的事情 我的表单有一个绑定到商店的组合框。 在用模型数据填充表单后,将填充存储 我的观点/形式 Ext.define('WWT.view.settings.Form', { extend : 'Ext.form.Panel', alias : 'widget.settingsform', title : 'WWT Instellingen', bodyPadding : 5,
Ext.define('WWT.view.settings.Form', {
extend : 'Ext.form.Panel',
alias : 'widget.settingsform',
title : 'WWT Instellingen',
bodyPadding : 5,
defaultType : 'textfield',
initComponent : function() {
var me = this;
me.dockedItems = me.buildToolbars();
me.items = me.buildItems();
me.callParent();
},
buildItems : function() {
var lovEdities = Ext.create('WWT.store.lov.Edities');
return [{
fieldLabel : 'Huidige Editie',
xtype : 'combo',
emptyText : 'Kies een Editie',
name : 'huidige_editie_id',
store : lovEdities,
queryMode : 'local',
displayField : 'naam',
valueField : 'id',
forceSelection : true
}, {fieldLabel : 'Scorebord Slogan',
name : 'scorebord_slogan_regel',
width: 200,
maxLength : 10
}, {
fieldLabel : 'Tijd Offset Scorebord',
name : 'scorebord_tijdoffset'
}];
},
buildToolbars : function() {
return [{
xtype : 'toolbar',
docked : 'top',
items : [{ xtype:'button',
text : 'Save',
iconCls : 'save-icon',
action : 'save'
}]
}];
}
});
我的控制器
Ext.define('WWT.controller.settings.Settings', {
extend : 'Ext.app.Controller',
models : ['secretariaat.Settings'],
views : ['settings.Form'],
init : function() {
var me = this;
me.control({
'#settingsId button[action=save]' : {
click : me.save
},
'settingsform' : {
afterrender : function(view) {
Ext.ModelMgr
.getModel('WWT.model.secretariaat.Settings')
.load(1, {
success : function(record) {
view.loadRecord(record);
}
});
}
}
});
},
save : function() {
var form = this.container.down('form');
var model = this.getModel('settings.Settings').set(form.getForm()
.getValues());
model.save();
},
addContent : function() {
this.container.add({
id : 'settingsIDQ',
xtype : 'settingsform',
itemId : 'settingsId'
});
}
});
在我的Chrome网络窗口中,我可以看到商店请求稍后被触发。
更新表单之前如何加载存储区?
我也想过在afterRender中这样做,但我认为即使这样,顺序也不能保证。似乎(加载)机制没有任何问题。 组合框ID字段的数据类型和作为设置一部分的字段中存在问题。Int vs String
这导致了问题。我用几种不同的方法解决了表单加载问题 如果应用程序中经常使用存储,我会在加载应用程序的早期加载存储,方法是使用
Ext.getStore('my store name here')
进行查找,然后在启动过程中调用.load()
。如果您希望仅在到达表单本身时加载一个或多个存储,我将在initComponent
中钩住组件的初始化,然后您可以获取表单的字段,并使用for循环遍历字段,在表单组件访问服务器数据之前,使用.load()
初始化所有存储
以下是我对initComponent方法的编辑。我还没有调试这段代码,但它应该对您非常有用
initComponent() {
var me = this;
// this is where we will load all stores during init
var fields = me.getForm().getFields();
for (var i = 0; i < fields.length; i++) {
var store = fields[i].getStore();
if (store && !store.isLoaded()) {
store.load();
}
}
me.dockedItems = me.buildToolbars();
me.items = me.buildItems();
me.callParent();
},
initComponent(){
var me=这个;
//这是我们在初始化期间加载所有存储的地方
var fields=me.getForm().getFields();
对于(变量i=0;i