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
}
});