UNPKG

angular-breadcrumbs

Version:
117 lines (104 loc) 3.91 kB
/** * ng-breadcrumb.js - v0.4.1 - A better AngularJS service to help with * breadcrumb-style navigation between views. * * @author Ian Kennington Walter (http://ianvonwalter.com) */ (function(angular) { 'use strict'; angular .module('ng-breadcrumbs', []) .factory('breadcrumbs', [ '$rootScope', '$location', '$route', function ($rootScope, $location, $route) { var BreadcrumbService = { breadcrumbs: [], get: function(options) { this.options = options || this.options; if (this.options) { for (var key in this.options) { if (this.options.hasOwnProperty(key)) { for (var index in this.breadcrumbs) { if (this.breadcrumbs.hasOwnProperty(index)) { var breadcrumb = this.breadcrumbs[index]; if (breadcrumb.label === key) { breadcrumb.label = this.options[key]; } } } } } } return this.breadcrumbs; }, generateBreadcrumbs: function() { var routes = $route.routes, _this = this, params, pathElements, pathObj = {}, path = '', originalPath = '', param, options; if ($route && $route.current && $route.current.originalPath) { this.breadcrumbs = []; params = $route.current.params; options = $route.current.options || {}; pathElements = $route.current.originalPath.trim().split('/'); // Necessary to get rid of of duplicate empty string on root path if (pathElements[1] === '') { pathElements.splice(1, 1); } angular.forEach(pathElements, function(pathElement, index) { param = pathElement[0] === ':' && typeof params[pathElement .slice(1, pathElement.length)] !== 'undefined' ? params[pathElement.slice(1, pathElement.length)] : false; pathObj[index] = { path: param || pathElement, originalPath: pathElement }; path = Object .keys(pathObj) .map(function(k) { return pathObj[k].path; }) .join('/') || '/'; originalPath = Object .keys(pathObj) .map(function(k) { return pathObj[k].originalPath; }) .join('/') || '/'; if (routes[originalPath] && (routes[originalPath].label || param) && !routes[originalPath].excludeBreadcrumb) { _this.breadcrumbs.push({ path: path, originalPath: originalPath, label: routes[originalPath].label || param, param: param, options: options }); } }); } } }; // We want to update breadcrumbs only when a route is actually changed // as $location.path() will get updated immediately (even if route // change fails!) $rootScope.$on('$routeChangeSuccess', function() { BreadcrumbService.generateBreadcrumbs(); }); $rootScope.$watch( function() { return BreadcrumbService.options; }, function() { BreadcrumbService.generateBreadcrumbs(); } ); BreadcrumbService.generateBreadcrumbs(); return BreadcrumbService; } ]); })(angular);