在ExtJS 4中,同时拥有相同视图和存储的最佳实践方法是什么?

5
我希望在ExtJS应用程序中同时拥有不同存储的同一视图的不同实例。目前我在viewport中创建了多个相同视图(Ext.view.View)的实例。
但是,如何最佳实践地在每个视图中拥有不同的存储?我找到的每个示例都在控制器的stores-Config中使用Store-ID创建视图。但是这将为每个视图使用相同的存储。
目前,我想到了以下可能的解决方案:
  1. 为每个视图实例创建自己的存储类。将所有存储添加到控制器并为每个视图实例使用不同的Store-ID。
  2. 根本不使用控制器的存储,并在视图的initComponent中手动创建一个新的存储,传递不同的参数给每个存储实例。
  3. 根本不使用控制器的存储,并在视图的initComponent中手动创建一个新的存储。然后使用load手动加载存储,为每个存储实例使用不同的参数。
这些解决方案中是否有最佳实践,或者应该以不同的方式完成?

2
没有评论的踩是毫无意义的... - Werzi2001
这是一个公正的问题,我不明白为什么会被踩。 - code4jhon
谢谢。顺便说一下,我决定采用第三种解决方案,直到有更好的解决方案被发布。 - Werzi2001
我能想到的问题之一是当你销毁相关组件时,需要额外的代码来销毁这些存储。我的意思是,如果你在initComponent函数中创建存储,则当你销毁相关的表格时,该存储可能会继续存在... - code4jhon
已经在这里提问过了:http://stackoverflow.com/questions/27368951/are-stores-created-in-the-initcomponent-function-memory-leaks-once-the-component - code4jhon
显示剩余3条评论
1个回答

3

关于控制器的存储数组,它会覆盖任何已定义的 storeId。加载 store 类后,控制器通过命名空间约定设置了 storeId,创建 store 并使用该值作为 soreId 的 getter 方法。

让我介绍第四个选项

  • 为视图定义一个商店,并在视图中引用它(也可以在控制器中引用它,只需使用requires数组)。
  • 为视图选择有效的itemId和有效的storeId,这些应该取决于视图的itemId(在创建视图时设置!)。
  • initComponent内创建storeId并在StoreManager中查找商店。如果不存在,请创建它并提供客户配置和storeId

如果您需要每次销毁视图和商店,请查看this post

Demo initComponent

initComponent: function() {
    var me = this,
        storeId = me.storeId + me.itemId;
    me.store = Ext.StoreManager.lookup(storeId);
    if(me.store === null)
        me.store = Ext.create('App.data.CustomViewStore',Ext.apply({storeId: storeId},me.storeCfg || {}));
    me.callParent(arguments);
}

注意:如果您使用views数组加载视图,则最终会得到一个getter,该getter可能不会给您期望的视图。您也可以在此处使用控制器的requires数组。如果要使用getter,只需使用refs配置创建自己的getter即可。

谢谢您的回复,但我看不出与我的选项2有什么“大”区别。它只是关于storeId和Ext.StoreManager吗?还是我漏掉了什么? - Werzi2001
@Werzi2001 不,这并不是一个很大的区别。但它是有意义的区别!问题在于你仍然可以定义自己的 store,并且不会在 initComponent 方法中污染你的视图。 - sra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接