web-dev-qa-db-fra.com

Itinéraires par défaut dans un contrôleur Backbone.js?

Je veux définir un itinéraire par défaut pour mon contrôleur backbone.js. Actuellement, je le fais comme ça:

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('#',''))

Existe-t-il une meilleure façon de procéder?

45
Martin Wawrusch

Essayez d'ajouter cette route supplémentaire comme dernière route dans votre contrôleur:

'*path':  'defaultRoute'

puis gérez-le comme ceci:

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

Cela suppose que l'itinéraire de liste est votre valeur par défaut préférée. Cela devrait fonctionner car Backbone.js correspondra aux routes dans l'ordre, mais correspondra toujours à la route "splat".

86
Bill Eisenhauer

Vous pouvez utiliser le format de route splat pour définir une route fourre-tout, telle que:

routes:
  'list' : 'showListView'
  '*path': 'defaultRoute'

defaultRoute: ->
  ...

Ces splats peuvent correspondre à n'importe quel nombre de composants URL. Puisque celui donné ici correspond essentiellement à n'importe quoi, l'ordre dans lequel les itinéraires sont définis importe. Les règles antérieures répertoriées dans le littéral routes ont priorité sur les règles ultérieures. Donc, la règle fourre-tout devrait être répertoriée en dernier.

Une note d'avertissement: La mécanique de l'instruction for in Laisse l'ordre d'itération des clés dans les objets non spécifié ( ECMA-262 section 12.6.4 ) :

La mécanique et l'ordre d'énumération des propriétés ... n'est pas spécifié.

La plupart des navigateurs, sinon tous avec quelques exceptions de buggy, répéteront par ordre de définition. Si les routes définies ont une ambiguïté dont la résolution correcte repose sur l'ordre (comme dans ce cas), et/ou si un ordre explicite peut être préférable en raison d'un environnement imprévisible, il est également possible de définir dynamiquement des routes dans les Router. initialiseur, plutôt que déclarativement/statiquement:

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

Dans ce cas, les itinéraires définis ultérieurement remplacent les itinéraires définis précédemment, de sorte que l'ordre précédent est inversé pour conserver le même comportement.

2
init_js