Обработка параметров пары ключ-значение в Backbone.js Router - PullRequest
8 голосов
/ 16 сентября 2011

Я хочу передать пары ключ-значение в качестве параметров для маршрутов Backbone и хочу, чтобы они были десериализованы в объект javascript перед вызовом сопоставленной функции.

var MyRouter = Backbone.Router.extend({
  routes: {
    "dashboard?:params" : "show_dashboard"
  },
  show_dashboard: function(params){
     console.log(params); 
  }
}); 

Когда я перехожу к «http: //...#dashboard? Key1 = val1 & key2 = val2», тогда {key1: «val1», key2: «val2»} должны быть напечатаны на консоли.

В настоящее время я использую jQuery BBQ метод $ .deparam внутри каждой отображаемой функции, чтобы получить десериализованный объект. Было бы хорошо, если бы я мог расширить Router и определить его только один раз, чтобы params был доступен во всех отображаемых функциях как объект. Каков был бы чистый способ сделать это? И есть ли какие-то подводные камни в этом ??

Большое спасибо,

Мано

1 Ответ

10 голосов
/ 18 ноября 2011

Вы должны переопределить функцию _extractParameters в Backbone.Router.Тогда все функции маршрутизатора будут вызваны с первым параметром, являющимся params объектом.

// Backbone Router with a custom parameter extractor
var Router = Backbone.Router.extend({
    routes: {
        'dashboard/:country/:city/?:params': 'whereAmIActually',
        'dashboard/?:params': 'whereAmI'
    },
    whereAmIActually: function(params, country, city){
        console.log('whereAmIActually');
        console.log(arguments);
    },
    whereAmI: function(params){
        console.log('whereAmI');
        console.log(arguments);
    },
    _extractParameters: function(route, fragment) {
        var result = route.exec(fragment).slice(1);
        result.unshift(deparam(result[result.length-1]));
        return result.slice(0,-1);
    }
});

// simplified $.deparam analog
var deparam = function(paramString){
    var result = {};
    if( ! paramString){
        return result;
    }
    $.each(paramString.split('&'), function(index, value){
        if(value){
            var param = value.split('=');
            result[param[0]] = param[1];
        }
    });
    return result;
};

var router = new Router;
Backbone.history.start();

// this call assumes that the url has been changed
Backbone.history.loadUrl('dashboard/?planet=earth&system=solar');
Backbone.history.loadUrl('dashboard/usa/la/?planet=earth&system=solar');

Рабочая демонстрация: здесь .

...