2013-04-15 21 views
11

Sto cercando di implementare named routes, quindi non devo scrivere l'intero percorso (spesso cambia).

stavo pensando che potrei farla franca con la scrittura di un servizio che potrebbe restituire l'elenco dei percorsi definiti e un filtro che avrebbe trasformato oggetto Una rotta

L'esempio utilizzo sarà simile:

<a ng-href="{id:1}|route:'detail'">Click here!</a> 

purché abbia aggiunto nome: 'dettaglio' alla mia definizione della rotta, si realizzerebbe il seguente risultato:

<a href="#/detail/1/">Click here!</a> 

Penso che questo è abbastanza semplice, ma :

Come posso ottenere l'elenco dei percorsi definiti?

Stavo pensando di poter utilizzare routeProvider, ma AFAIK non ha metodi o attributi pubblici a cui posso accedere.

+2

Finalmente qualcuno che capisce che qualcosa manca nella angolare. Mi piace molto di Django. – airtonix

+0

@airtonix, puoi controllare la mia soluzione sotto – g00fy

+0

@airtronix interessante .. IMO angolare è come i piselli e il django è come il pane di mais. A volte i piselli e il pane di mais sono un po 'strani quando li mangi insieme, ma uno non è un sostituto dell'altro-- cioè https://github.com/balderdashy/sails-docs/blob/master/getting-started /WhatIsSails.md#what-is-sails – mikermcneil

risposta

12

Risulta questo è piuttosto semplice:

http://plunker.co/edit/GNZxcvK4hfQ9LrlSvasK?p=preview

Components.filter('url', function ($route) { 
    function resolveRoute(options, route) { 
    var parts = route.split('/'); 
    for (var i = 0; i < parts.length; i++) { 
     var part = parts[i]; 
     if (part[0] === ':') { 
     parts[i] = options[part.replace(':', '')]; 
     if (parts[i] == undefined) throw Error('Attribute \'' + part + '\' was not given for route \'' + route + '\'') 
     } 
    } 
    return parts.join('/'); 
    } 

    return function (options, routeName) { 
    var routes = []; 


    angular.forEach($route.routes,function (config,route) { 
     if(config.name===routeName){ 
     routes.push(route); 
     } 
    }); 

    if (routes.length == 1) { 
     return resolveRoute(options, routes[0]); 
    } 
    else if (routes.length == 0) { 
     throw Error('Route ' + routeName + ' not found'); 
    } 
    throw Error('Multiple routes matching ' + routeName + ' were found'); 
    } 
}); 
+0

Grazie, mi sono preso la libertà di impacchetterlo in un modulo angolare appropriato: http://airtonix.github.io/angular-named-routes/ – airtonix

+2

@ g00fy solo per chiarire- $ route.routes è ciò che contiene l'array di tutte le rotte, giusto? Non l'ho provato in ultima angolazione, ma sembra che non funzioni in versioni legacy (testato in v1.2.16). Questo ha senso, dal momento che ngRoute è stato inserito in un modulo separato, ma vale la pena segnalarlo nel caso in cui aiuti qualcuno. Grazie per la risposta! – mikermcneil

Problemi correlati