2

ルートを使用して、sencha touch 2 アプリケーションを構築しています。私が直接理解している場合、これにはコントローラーでルートを指定し、 app.launch 関数を空のままにする必要があります (または、少なくとも、ビューをロードしたり、コントローラーを呼び出したりしないでください)。

私のコントローラーの 1 つは "" ルートを指定します。このルートは、URL ハッシュ部分が空の場合に読み込まれます ( http://localhost/):

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

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

ここまでは順調ですね....

ただし、この場合、ハッシュ部分にジャンクが含まれている場合 (たとえばhttp://localhost/#tralala、どのコントローラーにも tralala ルートが指定されていない場合)、アプリはロード画面でハングするだけです。アクションは呼び出されず、起動関数は空です。私が望むのは、ハッシュ部分が既知のルートと一致しない場合にロードされるルートです (ハッシュ部分のジャンクは、アプリの以前のバージョンのルートであるか、Facebook がハッシュでアクセストークンを提供して満足させようとしている可能性があります)リダイレクトで)。

起動機能で回避策が機能しています:

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'
    }));

これで、空のハッシュの代わりに「ホーム」をデフォルト ルートとして使用できるようになりました。

于 2012-08-23T10:32:42.033 に答える
0

しばらく時間が経っていることは承知しており、他に何を見つけたのか興味がありますが、以下を実装したところです: Sencha Touch 2 ルートはショートサーキットであるため、つまり、一致するルートが見つかると、Ext検索を停止します-リストErrorの最後にコントローラーをcontrollers追加し、何でも一致するルートを追加できます:

私の app.js には次のものがあります。

...
controllers: ['Whatever', 'AnotherOne', 'Error'],
...

routes最初の 2 つのコントローラーで必要なものを定義すると、次のようになりapp/controller/Error.jsます。

...
config: {
  routes: {
    ':foobar': {
      action: 'showNotFound',
      conditions: {
        ':foobar': ".+"
      }
    }
  }
}
...
showNotFound: function(hash) {
  // do whatever you need to
}

したがって、domain.com#whatever/456 にアクセスすると、アイテム #456 のビューを表示する可能性のある Whatever コントローラーが表示されますが、Ext がコントローラーの:foobarルートまで到達するErrorと、"404" ページにヒットします。 .

注: :foobar(404、Not Found など) ルートは最後にする必要があります。これは、リストの最後のコントローラーと構成の最後のルートを意味します。それ以外の場合は、その後の何よりも先にヒットします。

于 2013-02-03T18:24:53.030 に答える