Angular-ui-router beheben, Wert als Zeichenfolge
Mit ui-router, füge ich alle beheben Logik im staatlichen Funktion wie diese;
//my-ctrl.js
var MyCtrl = function($scope, customers) {
$scope.customers = customers;
}
//routing.js
$stateProvider.state('customers.show', {
url: '/customers/:id',
template: template,
controller: 'MyCtrl',
resolve: { //<-- I feel this must define as like controller
customers: function(Customer, $stateParams) {
return Customer.get($stateParams.id);
}
}
});
Aber IMO resolve
Objekt gehören ein controller, und es ist leicht zu Lesen und zu pflegen, wenn es definiert ist, innerhalb einer controller-Datei.
//my-ctrl.js
var MyCtrl = function($scope, customers) {
$scope.customers = customers;
}
MyCtrl.resolve = {
customers: function(Customer, $stateParams) {
return Customer.get($stateParams.id);
};
};
//routing.js
$stateProvider.state('customers.show', {
url: '/customers/:id',
template: template,
controller: 'MyCtrl',
resolve: 'MyCtrl.resolve' //<--- Error: 'invocables' must be an object.
});
Jedoch, Wenn ich es definieren als MyCtrl.resolve
wegen IIFE, bekomme ich die folgende Fehlermeldung.
Failed to instantiate module due to: ReferenceError: MyCtrl is not defined
Wenn ich definieren, dass man als string 'MyCtrl.resolve'
, bekomme ich diese
Error: 'invocables' must be an object.
Ich sehe, der controller ist definiert als string, so dass ich denke, es ist auch möglich, den Wert als string, indem ein decorator oder so etwas.
Hat jemand dies getan, Ansatz? So dass ich halten kann meine routings.js reinigen Sie und setzen entsprechende Infos. in eine entsprechende Datei?
- Wie bereits erwähnt, der controller ist noch nicht verfügbar an dieser Stelle. Die design-Muster, das ich nutzen einen
Resolver
service. Mitthis.self.name
im auflösen von Funktionen Gültigkeitsbereich (wo Sie IhreCustomer.get()
Anfrage), können Sie den Namen des Staates. Dann, etwas wiereturn Resolver.prepare( this.self.name )
können Sie extrahieren alle Logik inResolver
, und reduzieren Sie Ihre code, um eine einzige (und gleiche) line-in Ihrem Zustand-Deklarationen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie eine gute Art zu bauen, die lösen, aber ich glaube nicht, dass Sie es tun können.
Abgesehen von der Tatsache, dass "lösen" erfordert ein Objekt definiert wird, in einer phase, wo alles, was Sie zur Verfügung haben, sind Anbieter. In dieser Zeit, den controller gar nicht existiert.
Sogar noch schlimmer, obwohl das "beheben" soll definieren-Eingänge zu dem controller selbst. Definieren Sie die Entschlossenheit in den controller, dann erwarten, dass es ausgewertet werden vor den controller erstellt wird, ist eine zirkuläre Abhängigkeit.
In der Vergangenheit, die ich definiert haben, lösen Funktionen außerhalb des
$stateProvider
definition, zumindest so dass Sie wiederverwendet werden können. Ich habe nie versucht zu bekommen, eine schicker als die.Diese Frage ist über die features von ui-router-Paket. Von Standard-ui-router nicht unterstützt Saiten für resolve-parameter. Aber wenn man sich den source-code von ui-router, die Sie werden sehen, dass es möglich ist, um diese Funktionalität zu implementieren, ohne direkte änderungen des code.
Nun, ich werde Ihnen zeigen, die Logik hinter vorgeschlagene Methode und die Implementierung
Analyse der code
Zuerst werfen wir einen Blick auf $Staat.transitionTo Funktion angular-ui-router/src/urlRouter.js. Innerhalb dieser Funktion werden wir sehen, dieser code
Offensichtlich ist dies, wo die "resolve" - Parameter gelöst werden für jeden Elternteil Zustand. Als Nächstes werfen wir einen Blick auf resolveState Funktion in der gleichen Datei. Wir finden diese Linie gibt:
Dies ist speziell, wo die Versprechungen für die Lösung Parameter abgerufen werden. Was ist gut für den Einsatz, die Funktion, die dies tut, wird genommen, um eine eigenständige Dienstleistung. Das heißt, wir können Haken und verändern, es ist Verhalten mit decorator.
Referenz für die Umsetzung von $lösen ist, wird in angular-ui-router/src/resolve.js Datei
Umsetzung der Haken
Die Signatur zu beheben Funktion von $lösen ist
Wo "invocables" ist, wird das Objekt aus der Unabhängigkeitserklärung des Staates. Wir müssen also prüfen, ob "invocables" ist string. Und wenn es ist, wir bekommen eine controller-Funktion durch string und rufen Sie die Funktion nach dem ". " - Zeichen
EDIT:
Können Sie auch überschreiben, $controllerProvider mit Anbieter wie diese:
Diese Weise wird es möglich, fügen Sie eine neue Funktion getConstructor, das wird Rückkehr controller-Konstruktor mit Namen. Und so werden Sie vermeiden Sie die Verwendung von $window-Objekt in der hook:
Vollständige code demonstriert diese Methode http://plnkr.co/edit/f3dCSLn14pkul7BzrMvH?p=preview
$window
statt$controller
. Ist es möglich zu machen, verwenden Sie$controller
? Egal was, ich werde Ihnen den bounty da Sie noch am meisten Mühe, das problem zu lösen.$resolve
- service, so dass diese Problemumgehung nur eine begrenzte Lebensdauer haben.Müssen Sie stellen Sie sicher, dass die Steuerung innerhalb der gleichen Schließung wie der Staat config. Dies bedeutet nicht, dass Sie definiert werden müssen in der gleichen Datei.
Anstatt also eine Zeichenfolge, verwenden Sie die statische Eigenschaft des Controllers:
Update
Dann für Ihre Controller-Datei:
Dann, wenn Sie definieren Ihre Staaten in einer anderen Datei enthalten ist oder verkettet oder erforderlich, nachdem die controller-Datei:
Für Produktions-code, den Sie immer noch wollen, wickeln Sie all diese IIFEs in einem anderen IIFEs. Gulp oder Grunt kann dies für Sie tun.
Wenn die Absicht ist, wird der resolver in der gleichen Datei wie der controller, der einfachste Weg, dies zu tun ist zu erklären, dass die resolver auf der controller-Datei als eine Funktion:
Sollte diese Arbeit.