Как обнаружить неверный маршрут и вызвать функцию в Backbone.Controller

Есть ли какой-нибудь метод для обнаружения недопустимого (или неопределенного) маршрута и запуска страницы 404 в Backbone.Controller?

Я определил маршруты в моем контроллере следующим образом, но это не сработало.

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"

ОБНОВИТЬ:

Я использовал конструктор Backbone.Controller для сопоставления текущего хеш-фрагмента и @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"

1 ответ

Решение

Выше работает, но я не уверен, почему вы должны делать то, что вы делаете в конструкторе. Это может быть немного хрупким, но мы создаем отдельный контроллер, который мы включаем в последний. Он последний, так что маршрут сплат будет последним:

NotFound = Backbone.Controller.extend({

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

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

});

new NotFound();

Использование более надежной версии вышеупомянутого кажется мне более чистым подходом.

Другие вопросы по тегам