import { getOwner } from '@ember/application'; import Service, { inject as service } from '@ember/service'; import { computed } from '@ember/object'; export default Service.extend({ router: service(), // currentURL is only used to listen to all transitions. // currentRouteName has all information necessary to compute breadcrumbs, // but it doesn't change when a transition to the same route with a different // model occurs. breadcrumbs: computed('router.currentURL', 'router.currentRouteName', function() { const owner = getOwner(this); const allRoutes = (this.get('router.currentRouteName') || '') .split('.') .without('') .map((segment, index, allSegments) => allSegments.slice(0, index + 1).join('.')); let crumbs = []; allRoutes.forEach(routeName => { const route = owner.lookup(`route:${routeName}`); // Routes can reset the breadcrumb trail to start anew even // if the route is deeply nested. if (route.resetBreadcrumbs) { crumbs = []; } // Breadcrumbs are either an array of static crumbs // or a function that returns breadcrumbs given the current // model for the route's controller. let breadcrumbs = route.breadcrumbs || []; if (typeof breadcrumbs === 'function') { breadcrumbs = breadcrumbs(route.get('controller.model')) || []; } crumbs.push(...breadcrumbs); }); return crumbs; }), });