wake-up-neo.com

Gibt es eine Möglichkeit, alle nicht übereinstimmenden Routen mit Backbone zu erfassen?

Ich möchte eine "catch all" -Route haben, die läuft, wenn keine der anderen definierten Routen übereinstimmt. Ein 404-NotFound-Fehlerhandler.

Ich habe versucht, Folgendes hinzuzufügen, was zwar funktioniert, aber die Übereinstimmung anderer Routen verhindert:

this.route(/(.*)/, 'notFound', this.notFound);

Hat dieses Problem schon einmal gelöst?

40
evilcelery

Beantwortet hier der Vollständigkeit halber.

Sie können dies auf zwei Arten tun. Definieren Sie den regulären Ausdruck wie in der Frage mit route(). Wegen dieses Fehlers müssten Sie jedoch alle Ihre Routen über die route()-Methode und in umgekehrter Reihenfolge definieren (catchall oben). Dadurch wird verhindert, dass Sie den Routen-Hash verwenden. Daher ist (meine) bevorzugte Methode:

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

  '*notFound': 'notFound'
}

Der Schlüssel '*notFound' kann eigentlich alles sein, der mit * beginnt. Sie brauchen nur Zeichen hinter dem *, um einen Analysefehler zu vermeiden.

81
evilcelery

Es gibt eine andere, wohl einfachere/elegantere Art, dies zu lösen. Backbone.History.start() gibt entweder wahr oder falsch zurück, je nachdem, ob eine Route gefunden wurde oder nicht. Also, wenn Sie nur tun:

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

anstelle der üblichen:

Backbone.History.start();

es hat den gleichen Effekt wie die anderen Antworten.

20
machineghost

Dieses sehr kleine Plugin erledigt seine Arbeit: https://github.com/STRML/backbone.routeNotFound

Es ist die eleganteste und robusteste Art und Weise, dieses Problem zu lösen, das ich bisher gefunden habe. Beachten Sie jedoch, dass Sie mit Backbones Interna umgehen.

2
Pawel Dobierski

Ohne ein Beispiel für Ihren aktuellen Routing-Code würde ich davon ausgehen, dass Ihre gesamte Route als letzte Route für Sie geeignet ist

1
Dan

Fügen Sie es einfach als letzte Route in der Liste hinzu. Auf diese Weise wird es nur als Fallback-Option abgeglichen.

0
McGarnagle

Sie können es wie folgt in das Rückgrat hacken:

var _loadUrl = Backbone.history.loadUrl;
Backbone.history.loadUrl = function (fragment) {
    var result = _loadUrl.apply(Backbone.history, fragment);
    // the loadUrl returns false if no route was found.
    if(!result){
        // call 404 route on router if it exists.
        var handler = Backbone.history.handlers.filter( o => o.route.test("404") )
        if(handler.length) {
            Backbone.history.navigate("/404")

        }
    }
}

Dann können Sie in Ihrem Router Folgendes tun:

var Router = Backbone.Router.extend({
    routes: {
        "404": "pageNotFound"
    },

    pageNotFound: function () {
        alert("trigger pageNotFound route")
    }
});
0
winthers