2012-06-27 8 views

Respuesta

78

Respondiendo aquí para mayor información.

Puede hacerlo de 2 formas. Defina la expresión regular usando route(), como en la pregunta. Sin embargo, debido a this bug, necesitaría definir todas sus rutas a través del método route(), y en orden inverso (catchall en la parte superior). Esto le permite usar el hash rutas, por lo que (mi) método preferido es:

routes: { 
    'users/search': 'searchUsers', 
    'users/:id': 'loadUser', 

    '*notFound': 'notFound' 
} 

La clave '*notFound' realidad puede ser cualquier cosa a partir de *. Solo necesita caracteres después del * para evitar un error de análisis.

+11

Este problema de enrutamiento es un gran error en Backbone y [todavía lo están haciendo] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L932), la especificación de JavaScript no dice nada sobre [claves de objeto que se enumeran en el orden de origen] (http://stackoverflow.com/a/10624559/479863) o cualquier otro orden particular que no sea el mismo en varios lugares. Dependiendo de las "rutas" que enumeran en cualquier orden en particular es solo pedirlo. La única forma de estar seguro es usar 'route()' manualmente. –

+0

¡Muchas gracias por esto! : D –

+0

gracias gracias aaaand gracias. – wuliwong

0

Simplemente agréguela como la última ruta de la lista. De esta forma, solo se combinará como la opción alternativa.

-18

Creo que esto no debería pasar el JavaScript para resolver, debería ser el lenguaje para resolver, por ejemplo php. En el procesamiento del lado del servidor de palabras, mientras tenga la condición, puede responder con el número de error 404

+0

Esto se refiere al enrutamiento del lado del cliente usando 'hashs/​​hashbangs/pushstate'. El lado del servidor no es la respuesta. – Trevor

+0

@Trevor El problema no es con el cliente si el servidor para interactuar, no es una página estática, no tema ninguna importancia. – Myd

+6

Creo que es posible que desee leer un poco sobre enrutamiento de direcciones URL del lado del cliente con Backbone antes de intentar responder preguntas al respecto: http://documentcloud.github.com/backbone/#Router –

1

Sin un ejemplo de su código de enrutamiento actual, supongo que asegúrese de capturar todas las rutas en las que la última ruta debería funcionar usted

+1

Parece que realmente necesita agregarlo como la _última ruta a través de enrutador.ruta(), que es el problema. Parece un error, archivado aquí: https://github.com/documentcloud/backbone/issues/1463 – evilcelery

+1

@evilcelery: Sí, debe agregar rutas usando 'route()' si le importa el orden, Backbone (históricamente en menos) hace algunas suposiciones no válidas sobre el orden de iteración de los objetos, no hay un ordenamiento consistente de las claves de objeto en JavaScript. –

+1

Vaya, en realidad recibí la palabra enfatizada incorrecta, resulta que actualmente necesita agregarla como la * primera * ruta a través de 'route()'. – evilcelery

18

Hay otra manera, posiblemente más simple/más elegante de resolver esto. Backbone.History.start() devuelve verdadero o falso en función de si coincide con una ruta o no. Por lo tanto, si sólo hacemos:

if (!Backbone.history.start()) router.navigate('404', {trigger:true}); 

en lugar del habitual:

Backbone.History.start(); 

que tendrá el mismo efecto que las otras respuestas.

+0

¿Cómo se enterró esto? El bit 'router.trigger' está desactualizado, ¡pero la lógica es sonido! http://backbonejs.org/#History-start – clayzermk1

+0

Siéntase libre de votar esta respuesta si cree que debería estar enterrada :) – machineghost

+11

Pero creo que Backbone.History.start solo se invoca cuando la página se carga por primera vez, por lo tanto, si navega hacia una ruta no válida sin actualizar la página, esto no funcionará. – evilcelery

2

Esta muy pequeño plug-in se hace su trabajo: https://github.com/STRML/backbone.routeNotFound

Es la forma más elegante y robusta de la solución de este problema que he encontrado hasta el momento, sin embargo, debe tener en cuenta que mediante el uso de ella, que está metiendo con Los internos de Backbone.

Cuestiones relacionadas