dlrust
dlrust

Reputation: 2482

Reverse a route in Backbone js

Similar to Django's {{ url }}, is there a method or way to reverse a particular route by passing it a name and variables.

// example Router
var router = Backbone.Router.extend({
    routes: {
        '!/user/:user_id': 'editUserAction',
        '!/': 'homeAction'
    },
    editUserAction(user_id) {
        // edit user view
    },
    homeAction() {
        // home view
    }
});

Some method like

router.reverse('editUserAction', '5');

Would return the hash: !/user/5

router.reverse('homeAction');

Would return the hash: !/

Upvotes: 8

Views: 1076

Answers (2)

fxp
fxp

Reputation: 7082

A discussion about reverse routing. https://github.com/documentcloud/backbone/issues/951

a simple hack

var personRoutes = {
  list: "/persons",
  show: "/persons/:id",
  edit: "/persons/:id/edit"
}

var getRoute = function(obj, route, routeDefinitions){
  return routeDefinitions[route].replace(":id", obj.id);
}

var person = new Model({id: 1});
var route = getRoute(person, "edit", personRoutes); // => "/persons/1/edit"

Upvotes: 5

Derick Bailey
Derick Bailey

Reputation: 72858

Unfortunately no, there isn't anything like this built in to backbone. I've wanted something similar and there has been discussion of this on the list once or twice - maybe even a pull request (don't remember for sure at the moment). But it has not yet been done.

The best that I've come up with is to write my own methods that produce the correct route string:

function userEditPath(userId){
  return "/user/" + userId + "/edit";
}

Upvotes: 4

Related Questions