Ich versuche, meine App mit dem Restful / Ruby-Convenion /<resource>/[method]/[id]
zu strukturieren. Wie ich es vorher getan habe, als ich ein serverseitiges MVC-Framework wie CodeIgniter verwendet habe, war es, basierend auf dem URI dynamisch zu routen:
ex.
%Vor% Die App würde dann die Methode baz
in Controller / Klasse bar
verwenden und views/bar/baz.php
(gefüllt mit Daten aus bar->baz
)
Ich möchte das gleiche in Angular tun, aber ich bin mir nicht sicher, ob es das unterstützt (und wenn es so ist, bin ich mir nicht sicher, wie ich genau verfahren soll). Im Moment verwende ich $routeProvider
's when
Methode, um jeden Fall anzugeben. $ location.path () sieht so aus, als hätte es das, was ich brauche, aber ich denke nicht Ich kann es in app.js
(innerhalb config()
) verwenden.
Was ich gerne tun würde, ist etwa so:
%Vor%Und der Router ruft automatisch die entsprechende Methode auf.
BEARBEITEN Auch warum $ routeProvider ausflippt, wenn ich Spezifizieren Sie when('/foo/bar', {…})
?
EDIT 2 Per Lees Vorschlag geht es mir darum, so etwas zu tun:
%Vor%Ich habe Folgendes im $ routeProvider -Dokument festgestellt:
templateUrl - {string = | function () =} - Pfad oder Funktion, die a zurückgibt Pfad zu einer HTML-Vorlage, die von ngView verwendet werden soll.
Wenn templateUrl eine Funktion ist, wird sie wie folgt aufgerufen Parameter:
• {Array. & lt; Objekt & gt;} - Routenparameter, die aus dem aktuellen extrahiert werden $ location.path () durch Anwenden der aktuellen Route
Bearbeiten : Die Option, templateUrl
auf eine Funktion zu setzen, ist Teil des unstable 1.1.2 Build: # 1963 (funktioniert aber nicht ab 2013) -02-07).
Es gibt eine Diskussion über das Hinzufügen dieser Funktionalität auf AngularJS Github: # 1193 #1524 , aber ich kann nicht sagen, ob es tatsächlich implementiert wurde (in den obigen Dokumenten von Dash sieht es so aus wurde, und die Dokumente auf der Website wurden noch nicht aktualisiert).
EDIT 3 Um zu verdeutlichen, was ich möchte (per lee's Anfrage), möchte ich in einfachen Worten zu www.foo.com/index.html#/people
Angular sollte Controller people
verwenden, ruft automatisch die Methode index
auf und sollte
./ Aufrufe / Personen / index.html
./views/people/map.html
Auch wenn ich zu www.foo.com/index.html#/people/map
Angular sollte den people
Controller erneut verwenden, aber dieses Mal automatisch seine map
-Methode aufrufen und ... map.html bereitstellen (weil map in der URL angegeben wurde)
./ views / Personen / index.html
./ views / people / map.html
Dann, wenn ich nach
gehewww.foo.com/index.html#/widgets
Angular sollte aufstehen
./ Ansichten / Widgets / index.html
./views/widgets/details.html
Der Code für den Router sollte sehr generisch sein - ich sollte für jede Route kein .when()
angeben müssen.
Dies ist jetzt möglich mit ui-router
0.2.8:
Aber um $state.includes()
Über Nav-Menüs wäre das wahrscheinlich besser:
Das Obige könnte mit einer Schleife vereinfacht werden, um das state
s aus einem Array von Ressourcen aufzubauen ( $ stateProvider unterstützt das Hinzufügen von Zuständen im Grunde wann immer ):
Caveat ui-router unterstützt optionale State-Parameter nicht wirklich ( geplant für v0.4 )
Denken Sie darüber ein wenig mehr nach. Sie könnten nur einen einzigen Controller für diese generischen CRUD / REST-Typ-Operationen haben. Laden Sie dann die Vorlagen mit den Ressourcen- und Ansichtsparametern.
All dies kann mit einem einzigen Controller / Service erfolgen und dynamisch den Service generieren und URLs anzeigen.
Alles, was benutzerdefiniert ist, benötigen Sie einen benutzerdefinierten Controller und benutzerdefinierte Routen und Dienstmethoden für. Ich könnte vielleicht ein Beispiel zusammenstellen, aber nicht heute Nacht.
Hier ist ein Projekt auf github, das etwas tut, was dem entspricht, was Sie fragen
BEARBEITEN: Ich entdeckte etwas Interessantes, das mir noch nie in den Sinn gekommen war. Wenn Sie den Controller in der Route auslassen, wird der in der Vorlage angegebene Controller verwendet. Solange also alle Vorlagen, die Sie für einen bestimmten Controller verwenden, ng-controller="resource" haben, wird dieser Controller für die Vorlage wie erwartet geladen. Natürlich gibt es bei der aktuellen Implementierung von Routen keine optionalen Parameter. Wenn Sie also zwei oder drei Parameter haben, müssen Sie eine separate Route angeben. Das größte Problem scheint es, die Controller-Methode zweimal aufzurufen. Ich vermute, das liegt daran, dass es zwei Ansichten mit demselben Controller gibt. Jedoch sollte eine Ansicht die andere ersetzen, so dass es nicht zwei Aufrufe geben sollte. Das scheint mir ein Fehler zu sein. Ich fand auch eine Diskussion über ein mögliches neues Routing-System in den Werken, das vielleicht Ihren Bedürfnissen entspricht, aber es kann ziemlich weit entfernt sein: Ссылка . Das Beispiel auf GitHub verwendet jetzt die folgende Methode, sodass Sie diese durchsuchen können, wenn Sie möchten.
%Vor%Und die Vorlagen:
%Vor%Jetzt können Sie in Ihrem Controller die Methode dynamisch aufrufen.
%Vor%/ BEARBEITEN
Um bestehenden Routing-Systemen wie Rails zu entsprechen, steht jetzt die Möglichkeit zur Verfügung, die Methode in der Route zu definieren. Ich habe eine super einfache Lösung erstellt, mit der Routen eine Methode aufrufen können, die auf der Routendefinition und einer Direktive in der Ansicht basiert. Ich denke, Ui-Router ist nicht konventionell und ist zu kompliziert für eine solche "sollte sein" Kernfunktion.
Das Projekt heißt ngMethod und befindet sich unter: Ссылка .
Ein Beispiel für seine Verwendung ist: Ссылка
Also wenn ich eine Route wie folgt habe:
%Vor%und ich habe ng-Methode in der Kontakte / Formularvorlage:
%Vor%Dann ruft die ng-Methode entweder $ scope.edit () oder $ scope.new () im ContactsController auf. Dann können die Kontakte / Formularvorlage gemeinsam genutzt werden und je nach Route die richtige Methode aufrufen um die Daten zu laden. Dieser Stil ist jetzt mehr "Angularjs" und das Laden des Codes ähnelt dem winkeligen Aufruf von Modulen und Controllern.
Die vollständige Anweisung, die dies ermöglicht, ist weniger als 20 Zeilen Code:
%Vor%Tags und Links javascript angularjs ruby-on-rails rest url-routing