2012-06-15 32 views
2

我正在使用路由構建一個sencha touch 2應用程序。如果我直接理解,這需要在控制器中指定路由,並將app.launch函數留空(或至少不加載視圖/在那裏調用控制器)。Sencha Touch 2默認路由

我的一個控制器的指定「」的路線,這被加載時,網址的哈希部分是空的(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 = ""; 
    } 
}, 

,但是我不喜歡直接指向哈希代碼,它的工作是依賴於推出()被調用之前的路線第一次匹配,並且this.getRouter()對象是"private" and not supposed to be used

所以我的問題,什麼是「正確」的方式來提供默認路由?還是我完全錯過了使用路線的要點?

回答

2

在發射功能的哈希值檢查後,您可以執行下列操作...

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

現在你可以使用「家」爲您的默認路由,而不是一個空的哈希值。

+0

這個工作完美,但在sencha 2.3.1 Ext.app.Action被標記爲私人。 (http://docs.sencha.com/touch/2.3.1/#!/api/Ext.app。行動) 那麼在應用程序歷史記錄中設置項目的正確方法是什麼? – smarques

0

我知道這已經有一段時間了,我很想知道您還可以找到什麼,但我只是實現了以下內容:由於Sencha Touch 2路由短路 - 即一旦匹配路由發現,該分機停止查找 - 您可以在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#什麼/ 456將獲得無論控制器,它可以顯示的項目#456視圖,但如果內線得到一路下跌至Error控制器的:foobar路線那麼他們會打我的「404」頁面。

注意:您的:foobar(404,未找到等)路線必須爲最後。這意味着列表中的最後一個控制器,以及配置中的最後一個路由。否則它會在之後的任何事情之前被擊中。