Магистральный маршрутизатор не будет запускать события - PullRequest
6 голосов
/ 14 ноября 2011

У меня есть несколько навигационных ссылок на DOM при запуске приложения, которые я хотел бы использовать для прогрессивного улучшения с помощью Backbone (есть очень статичная версия текстового содержимого, лежащая в основе магистрального приложения).

HTML выглядит так:

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

Тогда мое приложение создается с использованием:

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

Рабочая область - это просто маршрутизатор, и эти маршруты из приложения правильно обрабатываются в маршрутизаторе с помощью функции инициализации, также ссылки работают и меняют URL-адрес, как и ожидалось, и делают это с хэшами в старых браузерах. Проблема заключается в том, что в самом маршрутизаторе / рабочей области не выполняются обратные вызовы. Он просто отключает звук и не запускает функции при щелчках

Вот мое Рабочее пространство / Маршрутизатор:

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

1 Ответ

2 голосов
/ 14 ноября 2011

Маршруты уже были связаны при запуске функции initialize (см. источник магистрали ).

Вы можете активировать привязку маршрутов с помощью функции _bindRoutes:

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