2011-06-27 3 views
8

¿Hay algún método para detectar la ruta inválida (o indefinida) y activar la página 404 en Backbone.Controller?Cómo detectar ruta no válida y función de disparo en Backbone.Controller

He definido rutas en mi controlador de esta manera, pero no funcionó.

class MyController extends Backbone.Controller 
    routes: 
     "method_a": "methodA" 
     "method_b": "methodB" 
     "*undefined": "show404Error" 

    # when access to /#method_a 
    methodA: -> 
     console.log "this page exists" 

    # when access to /#method_b 
    methodB: -> 
     console.log "this also exists" 

    # when access to /#some_invalid_hash_fragment_for_malicious_attack 
    show404Error: -> 
     console.log "sorry, this page does not exist" 

ACTUALIZACIÓN:

que utiliza el constructor de Backbone.Controller para que coincida con el fragmento de hash actual y @routes.

class MyController extends Backbone.Controller 
    constructor: -> 
     super() 
     hash = window.location.hash.replace '#', '' 
     if hash 
      for k, v of @routes 
       if k is hash 
        return 
       @show404Error() 

    routes: 
     "method_a": "methodA" 
     "method_b": "methodB" 
     "*undefined": "show404Error" 

    # when access to /#method_a 
    methodA: -> 
     console.log "this page exists" 

    # when access to /#method_b 
    methodB: -> 
     console.log "this also exists" 

    # when access to /#some_invalid_hash_fragment_for_malicious_attack 
    show404Error: -> 
     console.log "sorry, this page does not exist" 
+0

Si ha resuelto su problema, responda su propia pregunta. – Raynos

+2

La sugerencia es reescribir su pregunta para que solo contenga la pregunta y luego proporcione su propia respuesta. Por lo tanto, omita la respuesta en la pregunta. Puede encontrar que alguien tiene una mejor manera de responder a su pregunta si no proporciona la respuesta de inmediato. –

+0

Sí, su sugerencia es correcta. ¡Gracias por compartir al respecto! – tomodian

Respuesta

10

Lo anterior funciona, pero no estoy seguro de por qué tienes que hacer lo que haces en el constructor. Puede ser un poco frágil, pero creamos un controlador por separado que incluimos en último lugar. Su último de manera que la ruta símbolo es el último para que coincida con:

NotFound = Backbone.Controller.extend({ 

    routes: { 
    "*path" : "notFound" 
    }, 

    notFound: function(path) { 
    var msg = "Unable to find path: " + path; 
    alert(msg); 
    } 

}); 

new NotFound(); 

Usando una versión más robusta de lo anterior parece un enfoque más limpio para mí.

+0

Soy un novato de Backbone, y quería utilizar el enfoque anterior de Rails before_filter, que se dispara antes de ejecutar el método de Controller. Pero su solución también parece robusta y más limpia. ¡Gracias! – tomodian

Cuestiones relacionadas