2011-06-27 14 views
8

Czy istnieje metoda wykrywania nieprawidłowej (lub niezdefiniowanej) trasy i wywołania strony 404 w Backbone.Controller?Jak wykryć nieprawidłową funkcję trasy i wyzwalacza w Backbone.Controller

Mam zdefiniowane trasy w moim sterowniku w ten sposób, ale to nie zadziałało.

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" 

UPDATE:

kiedyś konstruktora Backbone.Controller dopasować bieżącego fragmentu mieszania i @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

Jeśli rozwiązałeś swój problem, odpowiedz na własne pytanie. – Raynos

+2

Proponujemy przepisanie Twojego pytania tak, aby zawierało tylko pytanie, a następnie podaj własną odpowiedź. Pomiń więc odpowiedź w pytaniu. Może się okazać, że ktoś ma lepszy sposób na udzielenie odpowiedzi na twoje pytanie, jeśli nie podasz natychmiastowej odpowiedzi. –

+0

Tak, Twoja sugestia jest właściwa. Dziękujemy za udostępnienie! – tomodian

Odpowiedz

10

Powyższe prace, ale nie jestem pewien, dlaczego musisz zrobić to, co robisz w konstruktorze. Może to być trochę kruche, ale tworzymy oddzielny kontroler, który włączamy jako ostatni. Jej ostatni tak że trasa ikona jest ostatni, aby dopasować:

NotFound = Backbone.Controller.extend({ 

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

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

}); 

new NotFound(); 

Korzystanie silniejszą wersję powyższego wydaje czystsze podejście do mnie.

+0

Jestem nowicjuszem w kręgosłupie i chciałem użyć podejścia Rails przed_filtrem, które wyzwala przed uruchomieniem metody kontrolera. Ale twoje rozwiązanie wydaje się również solidne i czystsze. Dziękuję Ci! – tomodian

Powiązane problemy