Skip to content

Instantly share code, notes, and snippets.

@NoumanSaleem
Created September 17, 2014 15:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NoumanSaleem/72d007a56e1e487e32e6 to your computer and use it in GitHub Desktop.
Save NoumanSaleem/72d007a56e1e487e32e6 to your computer and use it in GitHub Desktop.
named routes in angular (directive and filter)
'use strict';
(function (angular) {
function tokenToRegExp(token) {
return new RegExp(':(' + token + ')(?:\\(([^\\(]+)\\))?');
}
angular.module('fdNamedRoutes', [])
.provider('namedRouteProvider', ['$locationProvider', function namedRouteProvider($locationProvider) {
this.$get = ['$route', function ($route) {
var prefix = !$locationProvider.html5Mode() ? '#' + $locationProvider.hashPrefix() : '';
var namedRoutes = Object.keys($route.routes).reduce(function (obj, key) {
var route = $route.routes[key];
if (route.name) {
if (obj[route.name]) throw new Error('A route named "' + route.name + '" exists');
obj[route.name] = route;
}
return obj;
}, {});
function generate(routeName, routeParams) {
var route = namedRoutes[routeName],
tokens = routeParams ? Object.keys(routeParams) : null;
if (!route) throw new Error('Route "' + name + '" not found');
var url = !tokens ? route.originalPath : tokens.reduce(function (route, token) {
return route.replace(tokenToRegExp(token), routeParams[token]);
}, route.originalPath);
return prefix + url;
}
return generate;
}];
return this;
}])
.filter('url', ['namedRouteProvider', function urlFilter(namedRouteProvider) {
function filter(routeParams, routeName) {
return namedRouteProvider(routeName, routeParams);
}
return filter;
}])
.directive('link', ['namedRouteProvider', function linkDirective(namedRouteProvider) {
return {
link: function ($scope, ele, attr) {
var routeName = attr.link,
routeParams = {};
for (var key in attr) {
if (attr.hasOwnProperty(key) && /link\w+$/.test(key)) {
routeParams[key.slice(4).toLowerCase()] = attr[key];
}
}
ele.attr('href', namedRouteProvider(routeName, routeParams));
}
};
}]);
})(window.angular);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment