web-dev-qa-db-ja.com

Backbone.jsコントローラーのデフォルトルート?

Backbone.jsコントローラーのデフォルトルートを設定したい。現在私はそのようにしています:

class DealSearchController extends Backbone.Controller
    routes:
        'list' : 'showListView'
        'photos' : 'showPhotoView'
        'map' : 'showMapView'

    initialize: ->
        ....        
            window.location.hash = 'list' if ! _.include( _.keys(@routes),(window.location.hash || '').replace('#',''))

それを行うより良い方法はありますか?

45
Martin Wawrusch

この追加のルートをコントローラーの最後のルートとして追加してみてください:

'*path':  'defaultRoute'

そしてそれをこのように扱います:

defaultRoute: function(path) {
    this.showListView();
}

これは、リストルートが優先されるデフォルトであることを前提としています。 Backbone.jsはルートを順番に照合しますが、常に「splat」ルートを照合するため、これは機能するはずです。

86
Bill Eisenhauer

splatルート形式を使用して、次のようなキャッチオールルートを定義できます。

_routes:
  'list' : 'showListView'
  '*path': 'defaultRoute'

defaultRoute: ->
  ...
_

これらのスプラットは、任意の数のURLコンポーネントと一致できます。ここで与えられるものは本質的に何にでもマッチするので、ルートが定義される順番は重要です。 routesリテラルにリストされている以前のルールは、後のルールよりも優先されます。 したがって、キャッチオールルールを最後にリストする必要があります。

警告の注記:_for in_ステートメントのメカニズムにより、オブジェクトのキーの反復順序は指定されていません( ECMA-262セクション12.6.4 =):

プロパティを列挙するメカニズムと順序は指定されていません...

バグのある例外を除いて、ほとんどのブラウザは定義順に繰り返されます。定義されたルートに曖昧さがあり、その正しい解決が順序付けに依存している場合(この場合など)、および/または予測できない環境のために明示的な順序付けが望ましい場合、ルートをRouterの初期化子ではなく、動的に定義することもできます。宣言的/静的に:

_initialize: function () {
    //router.route(route, name, [callback]);
    this.route('*path', 'default', this.defaultRoute);
    this.route('map', 'map', this.showMapView);
    this.route('photos', 'photos', this.showPhotoView);
    this.route('list', 'list', this.showListView);
}
_

この場合、後で定義されたルートは以前に定義されたルートをオーバーライドするため、同じ動作を維持するために、以前の順序が逆になります。

2
init_js