我应该创建ExtJs4应用程序,该应用程序应该有主菜单,并且每个菜单项应该打开具有不同URL的新页面,因此如果用户在其他浏览器选项卡上复制URL和粘贴,应用程序应该打开该菜单项。
我想使用ExtJs推荐的MVC架构,但我不知道如何在多个页面/网址中使用它。他们所有的例子都使用单页。
一个选项是每次用户点击特定菜单项时重新加载页面,因此每个网址/菜单项/页面都将是与其MVC分开的ExtJS应用程序。但我认为这种方法有缺点,因为每次都会重新加载页面,这对性能不利。此外,它还会导致重用组件(不同页面的常见模型,商店和视图)出现困难。
所以我希望所有页面都有一个应用程序,但我不知道是否有任何解决方案可以为不同的视图设置不同的URL(在我的情况下:用于不同的菜单项)。
或者这种应用还有另一种方法吗?
答案 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的表单已隐藏在导航区域中,或者您要重新使用形式)