我正在使用路线构建一个sencha touch 2应用程序。如果我直接理解,这需要在控制器中指定路由,并将app.launch函数留空(或者至少不加载视图/调用控制器)。
我的一个控制器指定了“”路由,当url hash-part为空(http://localhost/
)时会加载该路由:
Ext.define('SOP.controller.PartyController', {
extend: 'Ext.app.Controller',
config: {
routes: {
"": "showChooseParty"
到目前为止一直很好....
但是在这种情况下,如果散列部分包含一些垃圾(例如http://localhost/#tralala
,当任何控制器中没有指定tralala路由时),应用程序只会在加载屏幕上挂起:不会调用任何操作,并且启动功能为空。我想要的是当哈希部分匹配没有已知路由时加载的路由(哈希部分垃圾可能是应用程序的先前版本中的路由,或者facebook试图让我很高兴在哈希中提供accessstoken在重定向)。
我在启动功能中有一个解决方法:
launch: function () {
if (!this.getRouter().recognize(window.location.hash.substr(1))) {
window.location.hash = "";
}
},
但是我不喜欢直接指向哈希的代码,它的工作依赖于在第一次匹配路由之前调用launch(),而this.getRouter()对象是{{3} }。
所以我的问题是,提供默认路由的“正确”方式是什么?或者我完全忽略了使用路线的意义?
答案 0 :(得分:2)
在启动功能中检查哈希值后,您可以执行以下操作...
this.getApplication().getHistory().add(Ext.create('Ext.app.Action', {
url : 'home'
}));
现在您可以使用'home'作为默认路由而不是空哈希。
答案 1 :(得分:0)
我知道已经有一段时间了,我很想知道你可能找到了什么,但我刚刚实现了以下内容:由于Sencha Touch 2路线短路 - 也就是说,一旦找到匹配的路线,Ext停止查找 - 您可以在Error
列表的末尾添加controllers
控制器,并添加与任何内容匹配的路由:
在我的app.js中我有:
...
controllers: ['Whatever', 'AnotherOne', 'Error'],
...
我在前两个控制器中定义了我需要的routes
,然后在app/controller/Error.js
我有这个:
...
config: {
routes: {
':foobar': {
action: 'showNotFound',
conditions: {
':foobar': ".+"
}
}
}
}
...
showNotFound: function(hash) {
// do whatever you need to
}
所以,任何人去domain.com#whatever / 456会得到Whatever控制器,它可以显示项目#456的视图,但是如果Ext一直到:foobar
路由的{{然后他们会点击我的“404”页面。
注意:您的Error
(404,Not Found等)路线必须是最后的。这意味着列表中的最后一个控制器,以及配置中的最后一个路由。否则它会在之后的任何事情之前被击中。