2013-04-15 10 views
11

Próbuję zaimplementować named routes, więc nie muszę pisać całej ścieżki (często zmiany).

Myślałam mogłem uciec z pisaniem usługę, która wróci listę zdefiniowanych tras oraz filtr, który będzie przekształcić obiekt do aroute

Przykład użycie wyglądałby następująco:

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

pod warunkiem dodałem nazwa: „szczegół” do mojej definicji trasy, będzie to generować następujący wynik:

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

myślę, że to jest dość proste, ale :

Jak mogę uzyskać listę zdefiniowanych tras?

Myślałem, że mogę skorzystać z routeProvider, ale AFAIK nie ma publicznych metod lub atrybutów, do których mogę uzyskać dostęp.

+2

Wreszcie ktoś, kto uświadamia sobie czegoś brakuje kanciasty. Uwielbiam to w Django. – airtonix

+0

@airtonix, możesz sprawdzić moje rozwiązanie poniżej – g00fy

+0

@airtronix ciekawe .. IMO kątowe jest jak groszek i django jest jak chleb kukurydziany. Czasami groch i chleb kukurydziany są dziwne, gdy je je razem, ale jeden z nich nie jest substytutem drugiego - tj. Https://github.com/balderdashy/sails-docs/blob/master/getting-started /WhatIsSails.md#what-is-sails – mikermcneil

Odpowiedz

12

okazuje się to dość proste:

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

Dzięki, skorzystałem z możliwości zapakowania tego w odpowiedni moduł kątowy: http://airtonix.github.io/angular-named-routes/ – airtonix

+2

@ g00fy tylko po to, aby wyjaśnić $ route.routes jest tym, co zawiera tablicę wszystkich tras? Nie testowałem w najnowszej wersji kątowej, ale wygląda na to, że nie działa w starszych wersjach (testowany w wersji 1.2.16). To oczywiście ma sens, ponieważ ngRoute został wciągnięty do osobnego modułu, ale warto go wskazać na wypadek, gdyby pomógł komukolwiek. Dziękuję za odpowiedź! – mikermcneil

Powiązane problemy