Unsere Anwendung verfügt über eine zweistufige Navigation. Wir möchten AngularJS verwenden $routeProvider
, um Vorlagen dynamisch für eine bereitzustellen <ng-view />
. Ich dachte daran, etwas in dieser Richtung zu tun:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Ich weiß nur nicht, wie ich die Teile innerhalb der füllen soll <<>>
. Ich weiß, dass das PrimaryNav und das SecondaryNav an die $ routeParams gebunden werden, aber wie greife ich hier auf $ routeParams zu, um die Vorlage dynamisch bereitzustellen?
quelle
config()
nur an Anbieter übergeben werden, werden keine tatsächlichen Dienstinstanzen wie z$routePrams
.template
statt verwendentemplateUrl
?template
eine Funktion einstellen , können Sie$routeParams
diese Funktion übergeben :$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. Sie können einen Controller jedoch nicht dynamisch auf diese Weise definieren :(Diese sehr hilfreiche Funktion ist ab Version 1.1.2 von AngularJS verfügbar. Es wird als instabil angesehen, aber ich habe es verwendet (1.1.3) und es funktioniert gut.
Grundsätzlich können Sie eine Funktion verwenden, um eine templateUrl-Zeichenfolge zu generieren. Der Funktion werden die Routenparameter übergeben, mit denen Sie die templateUrl-Zeichenfolge erstellen und zurückgeben können.
Vielen Dank an https://github.com/lrlopez für die Pull-Anfrage.
https://github.com/angular/angular.js/pull/1524
quelle
controllers
...?templateUrl kann als Funktion zur Rückgabe der generierten URL verwendet werden. Wir können die URL mit einem übergebenen Argument manipulieren, das routeParams benötigt.
Siehe das Beispiel.
Ich hoffe das hilft.
quelle
Okay, denke ich habe es verstanden ...
Wenig Hintergrund zuerst: Der Grund, warum ich das brauchte, war, Angular auf Node Express zu kleben und Jade meine Partials für mich verarbeiten zu lassen.
Also hier ist was du tun musst ... (trinke Bier und verbringe zuerst mehr als 20 Stunden damit !!!) ...
Speichern Sie beim Einrichten Ihres Moduls das
$routeProvider
global:Das kann mehr Info sein als nötig ...
Grundsätzlich möchten Sie die Variablen Ihres Moduls
$routeProvider
global speichern , z. B.routeProvider
damit Ihre Controller darauf zugreifen können.Dann können Sie einfach
routeProvider
eine NEUE Route verwenden und erstellen (Sie können eine Route nicht 'zurücksetzen' / 'Versprechen'; Sie müssen eine neue Route erstellen). Ich habe am Ende nur einen Schrägstrich (/) hinzugefügt, damit sie so semantisch ist Als der erste.Stellen Sie dann (in Ihrem Controller)
templateUrl
die Ansicht ein, die Sie treffen möchten.Nehmen Sie die
controller
Eigenschaft des.when()
Objekts heraus, damit Sie keine unendliche Anforderungsschleife erhalten.Und schließlich (noch im Controller) verwenden Sie
$location.path()
, um zu der gerade erstellten Route umzuleiten.Wenn Sie daran interessiert sind, eine Angular-App auf eine Express-App zu übertragen, können Sie mein Repo hier aufteilen: https://github.com/cScarlson/isomorph .
Mit dieser Methode können Sie auch die bidirektionalen AngularJS-Datenbindungen beibehalten, falls Sie Ihren HTML-Code mit WebSockets an Ihre Datenbank binden möchten. Andernfalls werden Ihre Angular-Datenbindungen ohne diese Methode nur ausgegeben
{{model.param}}
.Wenn Sie dies zu diesem Zeitpunkt klonen, benötigen Sie mongoDB auf Ihrem Computer, um es auszuführen.
Hoffe das löst dieses Problem!
Cody
Trink dein Badewasser nicht.
quelle
Router: -
Regler:-
Ich glaube, es ist eine Schwäche in anglejs, dass $ routeParams NICHT im Router sichtbar ist. Eine winzige Verbesserung würde während der Implementierung einen großen Unterschied machen.
quelle
Ich habe dies in meiner Winkelgabel unterstützt. Hier können Sie angeben
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
Ich bin mir nicht sicher, ob dies aufgenommen wird, da es für den Winkel irgendwie gegen den Strich ist, aber es ist nützlich für mich
quelle
in index.html
firstParam und secondParam können alles sein, was Ihren Bedürfnissen entspricht.
quelle
Ich hatte ein ähnliches Problem und benutzte
$stateParams
stattdessenrouteParam
quelle