2014-10-26 97 views
1

这更像是一个最佳实践/建议,我问在这里,因为我已经找到了解决我的问题,但我不知道:单个或多个商店实例在不同的组件上?

  • 如果“问题”应该得到解决;
  • 如果解决方案是最好的。

等等,让我们回过头来看看这个问题。我有一本图书管理器应用程序,它使用了两种对象:BookAuthor。你可以想像,每BookAuthor,所以,我需要:

  • 经理定义的作者(我使用了一个网格);
  • 一种为书选择作者的方法(我已经使用了组合框);

在ExtJS中,这涉及到Ext.grid.PanelExt.form.field.ComboBox。 我在每个部件上使用了相同的商店(AuthorStore),因为我的Author类非常简单(只有idauthorName作为字段)。最初,我使用autoLoad:true属性为商店,但是,正如我发现here,有一种更好的方法来执行此操作:将商店加载到所需组件的renderafterrender事件中。我完全同意这种说法。

之后,我已经注意到,网格和组合都有不同的存储实例(每个都加载其数据)。这对我来说似乎很奇怪,因为基本上,两个存储实例都保持完全相同的数据。此时,我想以某种方式为这两个组件共享同一个商店实例。我不喜欢的东西:

  • 定义返回单个存储实例的功能:

    function getAuthorStore(){ 
        return Ext.StoreMgr.lookup('authorStore') || Ext.create('BM.store.AuthorStore'); 
    } 
    
  • 更改网格的商店财产store: 'AuthorStore',store: getAuthorStore()

  • 做同样的事情为组合-box

  • 更改AuthorStore以声明addit有理财产并为load事件的侦听器:

    storeId: 'authorStore',    
        loaded: false, 
        listeners: { 
         load: function(store, records, success, operation, options) { 
          store.loaded = success; 
          console.log('store <<' + store.storeId + '>> was fully reloaded'); 
         } 
        } 
    
  • 变更为格状的控制器店财产store: 'AuthorStore',store: getAuthorStore()。此外,添加了render事件,下面的函数调用:

    loadStoreIfRequired: function() { 
         var me = this; 
         // loads the store only if the 'loaded' custom prop is not set 
         if (!me.store.loaded) { 
          me.store.load(); 
         } 
        } 
    
  • 最后,我也做了类似的组合框的东西(请注意,使用queryMode: 'local',使组合的商店不要当负载本身打开组合物品。

    .... 
        queryMode: 'local', 
        store: getAuthorStore(), 
        listeners: { 
         render: function(combo, options) { 
          var store = combo.getStore(); 
          if (!store.loaded) { 
           store.load(); 
          } 
         } 
        } 
    

什么,我想知道的答案是以下几个问题:

  1. 是单店的实例想法好还是坏?
  2. 我们假设我在网格上有一些过滤器。这些过滤器会导致组合显示,比方说,组合中的项目较少, ,因为它们共享相同的商店? (因此,在这种情况下,商店 不应在多个小部件之间共享)。
  3. 如果有更好的/更清洁的解决方案呢?

非常感谢您花时间阅读我的问题。请分享您的想法,如果有的话。

回答

2
  1. 如果您希望在多个视图中具有相同的数据,则单个商店是个不错的主意。
  2. 这是正确的,过滤器将适用于所有商店。
  3. 在EXT5“的连锁店”的概念已经实施,在这里看到的更多信息:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.ChainedStore
+0

你可以看到分机5的连锁店在这里的行动:http://extjs.eu/on-连锁店/ – Saki 2014-10-27 10:05:12

+0

谢谢大家的回答。 @Saki:你的ExtJS例子很有名!保持良好的工作! ;-) – hypercube 2014-10-28 07:50:21