2017-04-20 44 views
1

美好的一天。 我在EXTjs中完成了一个巨大的项目,在一个特定的视图中,有一个组合框选择国家,我想添加一个名为“WW”(WorldWide)的新“虚拟国家”,在商店加载后仅限于此特定点。Extjs仅在一个视图中向组合框添加新元素

我的第一个尝试是直接向商店中添加一个监听器,但是这在所有视图和商店所有地方都添加了新的国家/地区,这是一个很大的失败,因为项目的其他部分未构建到处理这个虚拟的国家。

所以,我想直接添加这个新的元素,我不得不使用它,但我有一些问题(我是很新的分机,我进入它非常缓慢)。 其实我已经推出了这样的事情:

tbar: [ 
     { 
      xtype: 'adcombobox', 
      displayField: 'name', 
      id:'formCountry', 
      reference: 'formcountry', 
      valueField: 'id', 
      store: 'Countries', 
      value: 0, 
      minChars: 0, 
      queryMode: 'local', 
      typeAhead: true, 
      forceSelection: true, 
      allowBlank: false, 
      emptyText: 'Select a country', 
      listConfig: { 
       itemTpl: [ 
        '<div><span class="" style="margin-right: 10px;"><img src="resources/flags/{id}.png"></span>{name}</div>' 
       ] 
      }, 
      listeners: { 
       select: 'onCountrySelect', 
       onLoad: function(store) { 
         store.insert(0, { 
          id:"ww", 
          shortCode: 'WW', 
          name: 'WorldWide' 
         }); 
       } 
      } 
     } 

这个什么都不做。 我不知道我是否打电话给错误的事件,或什么... 有人可以帮助我吗?你能带我走对路吗? 我也使用了“加载”事件,但没有成功。

更新1:

我来到这个解决方案在这一刻:

listeners: { 
       select: 'onCountrySelect', 
       afterRender: function(store) { 
         this.getStore().insert(0, { 
          id:"ww", 
          shortCode: 'WW', 
          name: 'WorldWide' 
         }); 
       } 
      } 

,似乎使的伎俩,是不是合法的?我担心的是要添加这个国家“只有一次”,所以afterRender似乎是正确的事件选择,因为“负载”不存在于组合框中(我读过它的某处)。

+1

我没有得到到底什么意思是“只有一次”?每当此代码运行时,您的记录将始终被插入。 –

+0

实际上我每次用组合框打开面板时都害怕得到一个“全球范围”,但似乎只有一次触发afterrender,顺便说一句,我只能得到一个全球范围的国家,这没关系现在,我试图找出如何增强代码,但实际上这是在做伎俩。 –

回答

0

如果将它添加到商店,它在商店中,并且绑定到商店的所有视图和组件都将使用该国家。

如果您需要的商店数据稍有不同,我只能推荐使用ChainedStore

您必须注意的主要限制是在Chained Store中,您可以过滤出源中仍然可用的数据;你不能添加数据。

所以,你会与包含应该在任何地方显示的所有数据商店开始,然后你过滤掉你不希望在某些组件/视图来显示什么:

Ext.define('AllCountries',{ 
    extend:'Ext.data.Store', 
    storeId: 'AllCountries', 
    inlineData:[{ 
     name: 'France', 
     fictional: false 
    },{ 
     name: 'Germany', 
     fictional: false 
    },{ 
     name: 'Middle-earth', 
     fictional: true 
    }] 
}); 

Ext.define('FictionalCountries',{ 
    extend: 'Ext.data.ChainedStore', 
    storeId: 'FictionalCountries', 
    source: 'AllCountries', 
    filters:[{ 
     filterFn:function(country) { 
      return country.get('fictional'); 
     } 
    }] 
}); 

Ext.define('NonFictionalCountries',{ 
    extend: 'Ext.data.ChainedStore', 
    storeId: 'NonFictionalCountries', 
    source: 'AllCountries', 
    filters:[{ 
     filterFn:function(country) { 
      return !country.get('fictional'); 
     } 
    }] 
}); 
+0

不幸的是,我无法更改商店数据,因此我无法向数据添加新字段以将其过滤掉。 –

相关问题