0

我正在使用 ExtJS 4.1。我正在尝试等待所有商店加载组合框。我监听窗口的 beforerender 事件。

在这种情况下,如果未定义组合框计数,那么我将获取所有组合框,保存计数,加载存储并注册一个减少组合框计数的回调。当计数变为零时,它调用 show 方法,并显示窗口。

如果定义了组合框计数,则如果它为零,则返回 true 以允许显示窗口,否则返回 false。

但是,问题在于并非所有组合框都显示 displayValue,而是显示 valueField。

    console.log('--- onWindowBeforeRender');

if (typeof this.comboboxCount != 'undefined') {
    if (this.comboboxCount == 0) {
        console.log('returning true:');
        return true;
    }
    else {
        console.log('returning false1:');
        return false;
    }
}

var x = component.query('combobox');

console.log('x.length:');
console.log(x.length);

this.comboboxCount = x.length;

for (var i = 0; i < x.length; i++) {
    var y = x[i];

    console.log('y:'+i);
    console.log(y);

    y.store.load({
        scope: this,
        callback: function(records, operation, success) {
            this.comboboxCount--;

            console.log('comboboxCount:' + this.comboboxCount);
            if (!this.comboboxCount) {
                console.log('all stores loaded.');
                this.show();
           }
        }
    });
}
console.log('returning false2');
return false;

这是组合框的代码:

                    {
                        xtype: 'combobox',
                        anchor: '100%',
                        fieldLabel: 'Region',
                        name: 'region_id',
                        displayField: 'name',
                        store: 'RegionStore',
                        valueField: 'id'
                    },
                    {
                        xtype: 'combobox',
                        anchor: '100%',
                        fieldLabel: 'Country',
                        name: 'country_id',
                        displayField: 'name',
                        store: 'CountryStore',
                        valueField: 'id'
                    }

这里是商店:

Ext.define('RR.store.CountryStore', {
  extend: 'Ext.data.Store',

  requires: [
  'RR.model.CountryModel'
  ],

  constructor: function(cfg) {
  var me = this;
  cfg = cfg || {};
  me.callParent([Ext.apply({
      model: 'RR.model.CountryModel',
      storeId: 'CountryStore',
      proxy: {
      type: 'ajax',
      api: {
          create: '/country/create',
          read: '/country/read',
          update: '/country/update'
      },
      reader: {
          type: 'json',
          root: 'countrys'
      }
      }
  }, cfg)]);
  }
});

Ext.define('RR.store.RegionStore', {
  extend: 'Ext.data.Store',

  requires: [
  'RR.model.RegionModel'
  ],

  constructor: function(cfg) {
  var me = this;
  cfg = cfg || {};
  me.callParent([Ext.apply({
      model: 'RR.model.RegionModel',
      storeId: 'RegionStore',
      proxy: {
      type: 'ajax',
      api: {
          create: '/region/create',
          read: '/region/read',
          update: '/region/update'
      },
      reader: {
          type: 'json',
          root: 'regions'
      }
      }
  }, cfg)]);
  }
});
4

1 回答 1

0

我已经解决了这个问题。组合框的存储一次只请求 25 条记录。并非所有记录都已加载。因此找不到 id 并且 displayField 的值被设置为 valueField。

更改服务器端代码以忽略启动/限制解决了该问题。

从商店的文档中:

如果此存储被缓冲,则只能找到碰巧缓存在页面缓存中的记录。这将是当前可见区域周围的数据集的一部分,或者如果页面尚未从缓存中清除,则为最近访问的区域

于 2013-07-26T18:17:54.270 回答