Добавление маршрутов к маршрутизатору Backbone.js, включая обработчик 404

Этот вопрос аналогичен вопросу 9595182, в котором объясняется, как программно добавлять маршруты. Это здорово, однако я пытаюсь добавить обработчик всего. Когда я это делаю, я получаю 404 для всех маршрутов.

Workspace = Backbone.Router.extend({

  routes: {
    "help": "help",
    "search/:query/p:page": "search",
  },

  help: function() {
    console.log("help");       
  },

  search: function(query, page) {
    console.log("search",query,page);
  }

});

app = new Workspace();
Backbone.history.start();

//This works
app.route("page/:number", "page", function(number){
    console.log("page called! " + number);
});

//This returns a 404 for everything
app.route("*notFound", "page", function(){
    console.log("404 error");
});

app.navigate('page/4',{trigger:true});
app.navigate('page/3',{trigger:true});
app.navigate('oohh404',{trigger:true});

Вот мой jsfiddle


person Mark Robson    schedule 20.06.2014    source источник


Ответы (1)


Как вы, наверное, заметили, функция route() добавляет маршрут в начало маршрутов Backbone, а не в конец, что означает, что каждый новый маршрут, который вы добавляете, будет проверяться перед последним добавленным маршрутом. В частности, когда вы вызываете route(), он вызывает Backbone.History.route(), который добавляет маршрут в начало массива handlers:

route: function(route, callback) {
  this.handlers.unshift({route: route, callback: callback});
},

Таким образом, на самом деле сначала необходимо добавить маршрут «поймать все», если вы добавляете все свои маршруты динамически (через функции) или последним в объекте routes, когда вы определяете свой маршрутизатор. Это позволит Backbone проверить, соответствует ли каждый маршрут, прежде чем достичь маршрута «поймать все», который вы хотите запустить, только если все другие маршруты не совпадают.

Но это, наверное, не то, что вы хотели услышать. Если вы действительно хотите добавить этот маршрут в конец после определения набора маршрутов, вам потребуется получить доступ к массиву handlers в пределах Backbone.History вместо push нового маршрута в конец, а не unshiftдобавлять его в перед массивом. Вам также потребуется продублировать функцию, которую Backbone выполнил в их route() для Backbone.Router.

Это, вероятно, не рекомендуется, так как вы получите доступ к внутренним функциям Backbone, которые могут измениться в будущем. Вы можете попробовать добавить запрос функции в кодовую базу Backbone или сделать это самостоятельно и отправить запрос на вытягивание.

person dylants    schedule 20.06.2014
comment
Это здорово. Я уверен, что другие вещи, которые я читал, предполагали, что маршруты были просто добавлены в Backbone.History. - person Mark Robson; 22.06.2014