Javascript 组合框在使用模型数据更新表单后存储加载

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,

我注意到有很多方法可以用数据填充表单。 我想用extjs4mvc风格来做。 然而,我现在看到一些不希望发生的事情

我的表单有一个绑定到商店的组合框。 在用模型数据填充表单后,将填充存储

我的观点/形式

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