我真的很喜欢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
),还是有更好的方式?
答案 0 :(得分:6)
这是一个非常广泛和有趣的问题,需要大量和彻底的解释(你可以在他们的指南和手册中找到在Sencha.com上的顺便说一句)。我想强调几点,这样你就可以开始:
商店通常是全球对象。一般情况下,您不会保留一个商店的两个实例。如果需要在多个不同视图中显示该存储中的信息,则可以使用过滤(本地或远程)。您需要克隆商店的唯一时间是,如果您想同时在2个以上的不同视图中提供该商店的不同信息。
控制器通常由主应用程序对象生成。您无需执行任何特殊操作 - 只需将它们列在controllers: []
属性中即可。然后在启动应用程序时(在创建和呈现它们的视图之前)生成。记在脑子里。
如果您有模态视图 - 可以手动创建它并重新使用它或销毁并稍后重新创建。您可以向创建这些视图的控制器添加过滤和加载。如果需要,您可以为不同的选项卡重复使用相同的视图/控制器对象。
如果您的视图正在呈现对象的一个实例(例如每个选项卡上显示一个产品) - 请勿将商店附加到这些视图。只需通过他们个人模型(记录)。
答案 1 :(得分:0)
我建议在视图的initComponent方法中创建仅与该视图实例相关的存储。
您的控制器的control
处理程序应该以一种可以区分调度事件的视图的方式进行编码。这应该不会太困难,因为几乎所有视图事件都包含对触发事件的组件的引用。然后,您可以使用相对查询选择器,例如:myEventFiringComponent.up('anotherComponent')
或myEventFiringComponent.down('anotherComponent')
,以便在需要时获取同一视图中不同组件的句柄。
请参阅this post以获取完整说明。