2012-12-19 11 views
7

Dies ist meine app.js-Datei. Ich muss auf die navigate Methode des Routers innerhalb der navigateToLogin Methode der LandingView Klasse zurückgreifen. Da der appRouter jedoch nach der Ansicht definiert ist, kann er den Router nicht innerhalb der Ansicht erkennen. Also muss ich einen Weg finden, global von jeder Klasse oder Methode auf den Router zuzugreifen. Wie kann ich dieses Problem umgehen?Wie Router global in Backbone-Js zugreifen?

var LandingView = Backbone.View.extend({ 
    tagName: 'div', 
    id: 'landing', 
    className: 'landingpad', 
    events: { 
     'click button#login': 'navigateToLogin', 
    }, 
    render: function(){ 

     (this.$el).append("<button class='button' id='login'>Login</button><br/><br/><br/>"); 
     (this.$el).append("<button class='button' id='new'>New User?</button>"); 

     console.log(this.el); 
     return this; 
    }, 
    navigateToLogin: function(e){ 
     app.navigate("/login", true); 
     return false; 
    }, 
}); 

var appRouter = Backbone.Router.extend({ 

initialize: function(){ 
    $('#content').html(new LandingView().render().el); 
} 
}); 

    app = new appRouter(); 
+0

Lukas Antwort sollte die akzeptierte Antwort auf diese Frage sein. –

Antwort

20

Wenn Sie in Backbone der Code ein wenig zu graben, werden Sie, dass die Umsetzung von navigate wiederum Router bemerken ruft Backbone.history.navigate:

// Simple proxy to `Backbone.history` to save a fragment into the history. 
navigate: function(fragment, options) { 
    Backbone.history.navigate(fragment, options); 
} 

Anstatt also explizit den globalen Bereich Ausmisten, verwenden Backbone.history.navigate:

var LandingView = Backbone.View.extend({ 
    ... 
    navigateToLogin: function(e){ 
     Backbone.history.navigate("/login", true); 
     return false; 
    }, 
}); 
+0

Ich löste das Navigationsproblem. Ich habe die Schrägstriche in der Navigationsfunktion weggelassen und es hat funktioniert :) Aber danke für die Info. Es ist interessant zu erfahren, dass es immer mehr als eine Möglichkeit gibt, ein Problem zu lösen :) – jaykumarark

+0

+1: Dies ist eine großartige Antwort. Vielen Dank! –

+0

Dies sollte die akzeptierte Antwort sein. –

7

Wenn Sie appRouter müssen zugänglich global sein, müssen Sie es bis zu einem gewissen globales Objekt anhängen. In Webbrowsern ist dies das Objekt window.

window.app = new appRouter(); 

und greifen Sie über Fenster:

window.app.navigate(...); 

Mit Globals zu Code führen kann, die zu halten ist schwierig. Wenn Ihre App keine triviale Größe hat, sollten Sie einen Entkopplungsmechanismus wie den mediator pattern verwenden.

+0

Nun, ich mache eine kleine App, die ziemlich überschaubar und rein für Bildungszwecke ist. Es funktionierte. Thanks :) – jaykumarark

+0

'\t Routen: { \t "": "init" \t "/ login": "loadLogin", \t}' Mein Router scheint nicht die loadLogin Funktion meines Routers auslösen. Ist etwas falsch mit der obigen Aussage? – jaykumarark

+0

@jaykumarark nicht sicher, versuchen Sie, die Route ohne den führenden Schrägstrich zu definieren. – jevakallio