ExtJS4 - 按面板实例存储?

时间:2012-04-16 13:05:54

标签: extjs extjs4 extjs-mvc

我真的很喜欢Ext中的MVC模式。 我有一个带有同一组件的多个实例的tabpanel(让我们称之为产品),每个实例应该在打开时调用服务器,并带有id参数。

现在,为了创建这些标签 - 我在产品控制器中使用它 这会创建一个新的视图实例,但我觉得它真的不正确。

createMainView: function (opts) {
    return Ext.widget("productDisplay", opts);
}

我从我的“主”控制器中调用它,如下所示:

var tab = this.application.getController("Products")
    .createMainView({ productId : id, closable: true })

tabs.add(tab);
tabs.setActiveTab(tab);

正确使用视图的多个实例的正确方法是什么,每个实例都有一个存储和行为的实例(通过控制器)。

我可以为它们使用一个命名存储(在app / store / product.js下使用js文件)吗?

我应该从控制器手动调用商店的load(传递productId),还是有更好的方式?

2 个答案:

答案 0 :(得分:6)

这是一个非常广泛和有趣的问题,需要大量和彻底的解释(你可以在他们的指南和手册中找到在Sencha.com上的顺便说一句)。我想强调几点,这样你就可以开始:

  1. 商店通常是全球对象。一般情况下,您不会保留一个商店的两个实例。如果需要在多个不同视图中显示该存储中的信息,则可以使用过滤(本地或远程)。您需要克隆商店的唯一时间是,如果您想同时在2个以上的不同视图中提供该商店的不同信息

  2. 控制器通常由主应用程序对象生成。您无需执行任何特殊操作 - 只需将它们列在controllers: []属性中即可。然后在启动应用程序时(在创建和呈现它们的视图之前)生成。记在脑子里。

  3. 如果您有模态视图 - 可以手动创建它并重新使用它或销毁并稍后重新创建。您可以向创建这些视图的控制器添加过滤和加载。如果需要,您可以为不同的选项卡重复使用相同的视图/控制器对象。

  4. 如果您的视图正在呈现对象的一个​​实例(例如每个选项卡上显示一个产品) - 请勿将商店附加到这些视图。只需通过他们个人模型(记录)。

答案 1 :(得分:0)

我建议在视图的initComponent方法中创建仅与该视图实例相关的存储。

您的控制器的control处理程序应该以一种可以区分调度事件的视图的方式进行编码。这应该不会太困难,因为几乎所有视图事件都包含对触发事件的组件的引用。然后,您可以使用相对查询选择器,例如:myEventFiringComponent.up('anotherComponent')myEventFiringComponent.down('anotherComponent'),以便在需要时获取同一视图中不同组件的句柄。

请参阅this post以获取完整说明。