1

だから私は少し問題があります。

私は複数の Backbone.Routers が必要な状況にあり、それに応じて独自のルートを処理し、メイン ルーター (次の例ではルーター 1) が現在ルートについて知っている情報に基づいてそれらを動的にロードします。

私が遭遇している主な問題は、このようなものです。

  • Router1 の負荷
  • Backbone.history.start()
  • Router1 が Router2 をロードします
  • 履歴がすでに開始されているため、Router2 は何もしません。

router1 のルートを再度呼び出すことなく、router2 に現在の履歴フラグメントを表示させる方法はありますか?

IE は手動で Backbone.history.loadUrl(Backbone.history.getFragment()); を呼び出さないでください。

編集:

主な目標は、現在 2 つのビューがあり、明らかにビューごとにルーターが必要であることです。将来、個々のビューをすべて認識している n 個のビューが存在する可能性があることを考えると、1 つの巨大なルーターを持つことは意味がありません。

4

2 に答える 2

2

Backbone を使用して複合アプリケーションを構築するための優れたフレームワークであるMarionetteJSを検討することをお勧めします。具体的には、 MarionetteJS サンプル アプリのソース コードを見てください。それは、アプリケーションをいくつかのサブアプリに分割することです。各サブアプリには独自のルーターがありますが、それらはすべて親アプリで個別のルーターを定義します。親アプリが初期化されると、すべてのルーターが作成されてからBackbone.history.start()呼び出されます。この答えには、学習曲線が急なマリオネットに飛び込む必要があることを理解していますが、それだけの価値があると思います. SOOMLA デザイナー Web アプリのアーキテクチャ全体を構築しましたその上。Marionette は、反復的な Backbone ボイラープレート コードを拡張したい場合に優れたソリューションであることが証明されています。素晴らしいオープン ソース フレームワークを提供してくれたDerick Baileyに感謝します。

于 2013-04-18T10:12:42.283 に答える
0

あなたのケースを再現するjsfiddleを提供していただけますか?あなたは通常それを行うことができるからです(私は個人的に、ルーターをインスタンス化し、履歴を開始し、他のいくつかをインスタンス化するアプリを持っていますが、それは完全に正常に動作します。)

それまでは、ルーターに関する情報をいくつか示します。
- ルーターをインスタンス化すると、ルートは Backbone.history (1 つの一意のオブジェクト) にバインドされます。これは、両方のルーターがコールバックを実行する こと
を期待できないことを意味します。
固定された順序があることを意味します: 最後にインスタンス化されたルーターのルートが最初にチェックされます

編集:
OK、誰かが直接 tab1/stuff にアクセスすることを期待しているので、両方のルートを実行したいと思います。
醜い方法: Backbone.history (Backbone.history.stop()) を停止し、その後すぐに開始できます。router2 のルートはバインドされます...
他の可能性: すべてのルートをメイン ルーターに配置しないのはなぜですか? 本当に多すぎる場合は理解できると思います。
最後の可能性(私が考えることができる):最後のルーターのルートが最初にテストされるという事実を使用してください。それが必要なことです。メイン ルーターのルートを変更し、必要なものをキャッチする一般的なルートを追加します (たとえば、tab1)。何もせずに、/tab1 に戻ります。次のように、2 つのナビゲートを準備します。

this.navigate('/tab1', {trigger: true});
this.once('someEvent', function() {
    this.navigate('/tab1/stuff', {trigger: true});
});

十分な一般的な URL がある場合は、tab1 & を一般的なルートに一致する引数に置き換えることができます。

編集 2:
最後のコメントで書いたすべての内容と、ビュー/アクションのようなハッシュタグ (または URL) を使用してバックボーン ビューにアクセスすることを前提とした編集です。できる限り詳しく説明するように努めます (問題の詳細をまだすべて把握していないため)。

この jsfiddleは原則を示しています。現在、クライアントの履歴を台無しにするという事実がまだあります (バックボーンでそれを回避する方法があるかもしれません。問題がある場合は、それを調べる必要があります)。

さて、他にもいくつかの問題があるかもしれないという事実。それらの最小のものは、セカンダリルーターのボイラープレートである可能性があります (ルートの前にview/を配置する必要があります)。それに対する解決策はありますが、それは深すぎるでしょう。より大きなものは次のとおり
です。すでに述べましたが、一致するルートは 1 つだけです。したがって、クライアントがビューを変更するという事実に対処するためにメインルーターを使用することはできません(たとえば、view1/action1からview2/action2に移動し、 router2 は以前にロードされています)。action2 は実行されますが、メイン ルーターでビューをリロードした場合は実行されません。
最後のコメントとして、メイン ルーターを作成した後にルーター コアの初期化メソッドを変更して定型的な動作を追加できます (ビューをリロードしますか? )

于 2013-03-28T13:12:55.543 に答える