2012-12-19 10 views
7

To jest mój plik app.js. Muszę uzyskać dostęp do metody routera navigate z metody navigateToLogin klasy . Ale ponieważ appRouter jest zdefiniowany po widoku, nie może rozpoznać routera z poziomu widoku. Potrzebuję więc znaleźć sposób na globalny dostęp do routera z dowolnej klasy lub metody. Jak mogę obejść ten problem?Jak uzyskać dostęp do routera globalnie w js szkieletu?

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

Odpowiedź Lukasa powinna być zaakceptowaną odpowiedzią na to pytanie. –

Odpowiedz

20

Jeśli kopać w kodzie szkieletowej za mało, można zauważyć, że realizacja routera z navigate z kolei wywołuje Backbone.history.navigate:

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

więc zamiast jawnie niszczeniu zakres globalny, użyj Backbone.history.navigate:

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

Rozwiązałem problem nawigacyjny. Pominąłem ukośniki w funkcji nawigacji i zadziałało :) Ale dzięki za informację. Ciekawe, że zawsze istnieje więcej niż jeden sposób rozwiązania problemu :) – jaykumarark

+0

+1: To jest świetna odpowiedź. Dziękuję bardzo! –

+0

To powinna być zaakceptowana odpowiedź. –

7

Jeśli potrzebujesz appRouter być dostępne globalnie, trzeba dołączyć go do jakiegoś globalnego obiektu. W przeglądarkach internetowych jest to obiekt window.

window.app = new appRouter(); 

i do niego dostęp za pośrednictwem okna:

window.app.navigate(...); 

Korzystanie globalne mogą prowadzić do kodu, który jest trudny do utrzymania. Jeśli Twoja aplikacja nie ma niewielkich rozmiarów, zastanów się nad użyciem mechanizmu odsprzęgania, takiego jak mediator pattern.

+0

Cóż, robię małą aplikację, która jest całkiem zarządzalna i wyłącznie do celów edukacyjnych. Zadziałało. Dzięki :) – jaykumarark

+0

'\t trasy: { \t "": "init" \t "/ login": "loadLogin" \t}' Mój router nie wydają się wywołać funkcję loadLogin mojego routera. Czy jest coś nie tak z powyższym stwierdzeniem? – jaykumarark

+0

@jaykumarark nie jestem pewien, spróbuj zdefiniować trasę bez wiodącego ukośnika. – jevakallio

Powiązane problemy