如何使用ExtJs 4创建多页面应用程序

时间:2012-05-24 15:32:21

标签: extjs extjs4 extjs-mvc

我应该创建ExtJs4应用程序,该应用程序应该有主菜单,并且每个菜单项应该打开具有不同URL的新页面,因此如果用户在其他浏览器选项卡上复制URL和粘贴,应用程序应该打开该菜单项。

我想使用ExtJs推荐的MVC架构,但我不知道如何在多个页面/网址中使用它。他们所有的例子都使用单页。

一个选项是每次用户点击特定菜单项时重新加载页面,因此每个网址/菜单项/页面都将是与其MVC分开的ExtJS应用程序。但我认为这种方法有缺点,因为每次都会重新加载页面,这对性能不利。此外,它还会导致重用组件(不同页面的常见模型,商店和视图)出现困难。

所以我希望所有页面都有一个应用程序,但我不知道是否有任何解决方案可以为不同的视图设置不同的URL(在我的情况下:用于不同的菜单项)。

或者这种应用还有另一种方法吗?

1 个答案:

答案 0 :(得分:2)

您可能希望使用视口,并将中心区域设为容器。

中心区域容器通常具有卡片或标签布局。

当用户导航到新视图(Component)时,您将该视图添加到Container,并使其处于活动状态。

最大的错误是首先更改网址。你不想那样做。

您想要导航,然后在导航成功时设置URL。你可能不应该使用ExtJS的History组件,因为它被错误地实现了。我建议使用HTML5 pushState。

您应确保导航系统无需更改网址栏即可运行。

我建议您阅读Microsoft Prism,WPF和Silverlight中的Navigation,因为那里有更多文档,然后将其应用于ExtJS。

http://msdn.microsoft.com/en-us/library/gg430881(v=pandp.40).aspx

以下是导航过程示例:

  • 致电app.requestNavigate('contacts/5');,您可以自行添加。

  • 您将此片段解析为:

navigationContext = {  
  fragment: 'contacts/5',  
  xtype: 'contacts-form',  
  parameters:{  
    id: 5  
  }  
}

可选:如果使用表格:

  • 从导航区域(您的中心区域)获取有效项目。如果存在,请致电confirmNavigationRequest(callback)。您需要添加此方法或事件。

  • 如果callback(true),请继续导航。这允许用户取消导航,如果表单是“脏”

结束可选

  • 然后,最简单的方法是创建widget的新navigationContext.xtype,将其添加到导航区域,然后调用setActiveItem(widget)。如果存在,则销毁之前的活动项目。

然后致电history.pushState(null, null, navigationContext.fragment)

然后在视图上引发'navigatedto'事件,传递上下文,然后您可以从那里加载数据。

更高级的方案包括:

  • 如果您希望返回上一个组件,请将其保持活动状态。添加keepAlive属性,如果为true,则在将新组件添加到容器时不要销毁。

  • 搜索容器并询问每个组件是否要处理当前导航请求(例如,如果加载了contact-5的表单已隐藏在导航区域中,或者您要重新使用形式)