2011-11-14 3 views
6

Ho alcuni collegamenti di navigazione sul dom all'avvio dell'app che desidero dirottare per il miglioramento progressivo tramite Backbone (esiste una versione di contenuto testuale molto statica sottostante l'app backbone).Il router backbone non attiva gli eventi

il codice HTML si presenta così:

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

Allora la mia app è istanziato con:

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'area di lavoro è solo un router e quelle rotte da app siano correttamente elaborate nel router via la funzione di inizializzazione, anche i collegamenti funzionano e cambiano l'URL come previsto e lo fanno con gli hash sui browser più vecchi. Il problema è che non vengono mai effettuate chiamate nel Router/Workspace stesso. E 'semplicemente muta e entrate fuoco le funzioni quando i click sono fatti

Ecco il mio lavoro/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 
} 
}); 

risposta

2

I percorsi sono già stati vincolati quando viene eseguita la funzione initialize (vedi the backbone source).

È possibile attivare i percorsi di legame con la funzione _bindRoutes:

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