2

我正在使用路由构建一个 sencha touch 2 应用程序。如果我直接理解,这需要在您的控制器中指定路由,并将您的 app.launch 函数留空(或者至少,不在那里加载视图/调用控制器)。

我的一个控制器指定了 "" 路由,当 url 哈希部分为空 ( http://localhost/) 时会加载该路由:

Ext.define('SOP.controller.PartyController', {
   extend: 'Ext.app.Controller',

    config: {
        routes: {
           "": "showChooseParty"

到目前为止,一切都很好....

但是在这种情况下,如果哈希部分包含一些垃圾(例如http://localhost/#tralala,当任何控制器中没有指定 tralala 路由时),应用程序只会挂在加载屏幕上:没有调用任何操作,并且启动函数为空。我想要的是当哈希部分与未知路由匹配时加载的路由(哈希部分垃圾可能是应用程序早期版本中的路由,或者 facebook 试图让我高兴地在哈希中提供 accesstoken在重定向中)。

我有一个解决方法,在启动功能中:

launch: function () {
    if (!this.getRouter().recognize(window.location.hash.substr(1))) {
        window.location.hash = "";
    }
},

但是我不喜欢直接指向哈希的代码,它的工作取决于在第一次匹配路由之前调用 launch() ,并且 this.getRouter() 对象是“私有的”并且不应该被使用

所以我的问题是,提供默认路由的“正确”方式是什么?还是我完全错过了使用路线的意义?

4

2 回答 2

2

在启动函数中检查哈希值后,您可以执行以下操作...

this.getApplication().getHistory().add(Ext.create('Ext.app.Action', {
        url : 'home'
    }));

现在您可以使用 'home' 作为默认路由,而不是空哈希。

于 2012-08-23T10:32:42.033 回答
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 的人都会得到任何控制器,它可能会显示项目 #456 的视图,但如果 Ext 一直到达控制器的:foobar路由,Error那么他们将点击我的“404”页面.

注意:您的:foobar(404、未找到等)路线必须是最后的。这意味着列表中的最后一个控制器,以及配置中的最后一个路由。否则它会在它之后的任何东西之前被击中。

于 2013-02-03T18:24:53.030 回答