2011-11-14 4 views
6

J'ai des liens de navigation sur le dom lorsque l'application est démarrée que je souhaite détourner pour une amélioration progressive via Backbone (il y a une version de contenu texte très statique sous-jacente à l'application backbone).Le routeur backbone ne déclenchera pas d'événements

Le html ressemble à ceci:

... 
<body> 
<header> 
<nav> 
<ol> 
<li> 
<a href="/en/home">home</a> 
</li> 
<li> 
... few more links 
</header> 

Ensuite, mon application est instancié à l'aide:

var App = (function(fw){ 
var $  = fw; 
var workspace   = {}; 
var self  = {}; 
var lang  = "en"; 
var models  = {...}; 
var views  = {...}; 
var collections = {...}; 
self.init = function() { 
    workspace = new Workspace(
    { 
    routes: { 
    "/": "home", 
    "/home": "home", 
    "/terms": "terms", 
    "/news": "blog" 
    }, 
    lang : lang 
    }) 
} 
return self; 
}); 
var app; 
// launch 
$(document).ready(function() { 
app = new App(jQuery); 
app.init(); 
}); 

L'espace de travail est juste un routeur et les routes de l'application sont traitées correctement dans le routeur via la fonction initialize, aussi les liens fonctionnent et changent l'URL comme prévu et le font avec hashes sur les navigateurs plus anciens. Le problème est qu'aucun callback n'est jamais fait dans le routeur/espace de travail lui-même. Il est tout simplement muet et ne marche pas tirer les fonctions lorsque les clics sont faites

Voici mon espace de travail/Router:

var Workspace = Backbone.Router.extend({ 

routes : {}, 
//functions      <------------THESE 
home: function(e){ 
    e.preventDefault(); 
    console.log("home here"); 
    App.views.HomeView.render(); 
}, 
terms: function(){   //<-----------NEVER 
    console.log("terms here"); 
    App.views.TermsView.render(); 
}, 
blog: function(){   //<-----------FIRE 
    console.log("blog here"); 
}, 
initialize: function(params){ 
    var t = this; 
    var tmpr = {}; 
    for(var i in params.routes) 
    { 
    //this just fuses lang and each route so /home becomes /en/home 
        tmpr["/"+params.lang+i] = params.routes[i]; 
    } 
    this.routes = tmpr; // this is fine and when logged it shows nicely with all routes looking good 
    // router will only ever initialize once so lets deal with the stuff currently on the DOM before the app is inited. 
    $("a",$("header")).click(function(e){ 
    e.preventDefault(); 
    Backbone.history.navigate($(this).attr("href"),true);//<-- true is set? should fire methods? 
    // I've also tried all kinds of variations like t.navigate(..) where t is this workspace 
    }); 
//this also seems to be fine and either does hashes or states 
    if(history && history.pushState) { 
    Backbone.history.start({ 
    pushState : true 
    }); 
    console.log("has pushstate"); 
    } else { 
    Backbone.history.start(); 
    console.log("no pushstate"); 
    } 
    console.log("Router inited with routes:",this.routes);//logs routes nicely 
} 
}); 

Répondre

2

Les routes ont déjà été liés lorsque la fonction est exécutée initialize (voir the backbone source).

Vous pouvez déclencher les voies de liaison avec la fonction _bindRoutes:

this.routes = tmpr; 
this._bindRoutes(); 
Questions connexes