2013-04-15 13 views
11

Ich versuche named routes zu implementieren, also muss ich nicht den ganzen Pfad schreiben (oft Änderungen).

ich dachte ich könnte weg einen Dienst mit dem Schreiben, das die Liste der definierten Routen und einen Filter zurückkommen würde, das Objekt

Die Verwendung Beispiel würde so aussehen aroute verwandeln würde:

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

vorausgesetzt, ich habe Namen hinzugefügt: ‚Detail‘ auf meine Route Definition, würde dies das folgende Ergebnis erzeugen:

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

ich denke, das ist ganz einfach, aber :

Wie bekomme ich die Liste der definierten Routen?

Ich dachte, ich kann routeProvider verwenden, aber AFAIK hat es keine öffentlichen Methoden oder Attribute, die ich zugreifen kann.

+2

Schließlich jemand anderes, etwas realisiert in Winkel fehlt. Ich liebe das über Django. – airtonix

+0

@Airtonix, können Sie meine Lösung unter – g00fy

+0

@Airtronix interessant .. IMO eckig ist wie Erbsen und Django ist wie Maisbrot. Manchmal sind die Erbsen und Maisbrot irgendwie komisch, wenn man sie zusammen isst, aber man ist definitiv kein Ersatz für den anderen - zB https://github.com/balderdashy/sails-docs/blob/master/getting-started /WhatisSails.md#what-is-sails – mikermcneil

Antwort

12

stellt sich heraus, das ist ziemlich einfach:

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

Danke, ich habe mir die Freiheit genommen, dies in ein richtiges Winkelmodul zu verpacken: http://airtonix.github.io/angular-named-routes/ – airtonix

+2

@ g00fy nur um zu klären- $ route.routes enthält das Array aller Routen richtig? Ich habe nicht im neuesten Winkel getestet, aber es scheint, dass es in älteren Versionen nicht funktioniert (getestet in v1.2.16). Das macht natürlich Sinn, da ngRoute in ein separates Modul gezogen wurde, aber es lohnt sich darauf hinzuweisen, falls es jemandem hilft. Danke für die Antwort! – mikermcneil

Verwandte Themen