AngularAMD + UI-Router + dynamischer Controllername?

7

Ich versuche, eine generalisierte Route in meiner Anwendung zu schreiben und die View- und Controller-Namen auf der Basis der Route-Parameter aufzulösen.

Ich habe den folgenden Code, der funktioniert:

%Vor%

Ich bin jedoch nicht in der Lage, den Controllernamen dynamisch aufzulösen. Ich habe versucht, resolve wie hier beschrieben zu verwenden , aber ui-router scheint anders zu lösen als angular-route.

Irgendwelche Zeiger?

BEARBEITEN : Ich habe bereits versucht, controllerProvider zu verwenden, aber es funktioniert nicht für mich (zum Beispiel gibt der folgende Code nur einen hartcodierten Controller-Namen zurück, um zu testen, ob er tatsächlich funktioniert) :

%Vor%

Gibt mir den folgenden Fehler:

  

Fehler: [ng: array] Argument 'userController' ist keine Funktion, wurde undefiniert    http://errors.angularjs.org/1.3.3/ng/areq?p0=userController&p1=not%20aNaNunction%2C%20got%20undefined

    
Sayak Banerjee 14.12.2014, 01:01
quelle

1 Antwort

19

Dies ist ein Link zu Arbeitslos .

Lösung

Wir benötigen zwei Funktionen des UI-Routers:

  • resolve (um die fehlenden Teile von js-Code zu laden)
  • controllerProvider (siehe Zitate aus der Dokumentation unten)

angularAMD - main.js Definition

Dies wäre unsere main.js, die die intelligente Konvertierung controllerName - controllerPath:

enthält %Vor%

Controller:

%Vor%

app.js

Zuerst würden wir eine Methode benötigen, die den Parameter (z. B. id) in den Namen des Controllers umwandelt. Für unsere Testzwecke verwenden wir diese naive Implementierung:

%Vor%

.state()

Und das wäre schließlich unsere Zustandsdefinition

%Vor%

Überprüfen Sie es hier in diesem Arbeitsbeispiel

Dokumentation

Wie hier dokumentiert: $ stateProvider Für state(name, stateConfig) können wir controller und controllerProvider verwenden. Einige Auszug aus der Dokumentation:

controllerProvider

...

controller (optional) Zeichenfolgenfunktion

  

Controller fn, der dem neu verwandten Bereich oder dem Namen eines registrierten Controllers zugeordnet werden soll, wenn er als String übergeben wird. Optional können die ControllerAs hier deklariert werden.

%Vor%

controllerProvider (optional) Funktion

  

Injizierbare Providerfunktion, die den tatsächlichen Controller oder die Zeichenfolge zurückgibt.

%Vor%

...

auflösen

resolve (optional) Objekt

  

Eine optionale map<string, function> der Abhängigkeiten, die in den Controller injiziert werden sollen. Wenn eine dieser Abhängigkeiten verspricht , wartet der Router darauf, dass ALL aufgelöst wird , bevor der Controller instanziiert wird ...

i.e. verwenden wir controllerProvider :

  

... um den Controllernamen dynamisch aufzulösen ...

Falls Sie es geschafft haben, hierher zu kommen, möchten Sie vielleicht eine andere ähnliche Lösung mit RequireJS - eckig suchen -ui-router mit requirejs, lazy laden des controllers

    
Radim Köhler 14.12.2014, 06:23
quelle