Der Angular Ui-Router erlaubt mehrere verschachtelte Ansichten. Die Rolle dieser austauschbaren Ansichten scheint sich mit der Rolle von Richtlinien zu überschneiden.
Was sind die Vor-/Nachteile der Verwendung von (mehrfach, verschachtelt) ui-view
s vs winkligen Direktiven ?
Zustände und Routing sind 2 verschiedene Funktionen. Mit States können Sie die Vorlagen partial.html und deren Controller austauschen und (optional?) eine entsprechende URL/Route angeben.
In einer E-Mail-Antwort von Tim Kindberg (a ui-router
dev):
ui-view ist eine Direktive. Wenn Sie es also verwenden, verwenden Sie eine Direktive, die speziell für den Rest des ui-router-Moduls entwickelt wurde. Ich kann mir nicht vorstellen, dass es einfach ist, eine eigene Direktive zu erstellen, um diese Funktionalität zu ersetzen.
Und dazu könnten Sie anscheinend zwei Optionen haben:
Normale Anweisungen:
app.directive('myDir1', {/* controller: ... */})
.directive('myDir2', {/* controller: ... */})
vs ui-view "Direktiven"
$stateProvider.state('route1', {
/* url: "/route1", // optional?? */
views: {
"myDir1": { templateUrl: "myDir1.html" /* , controller: ... */ },
"myDir2": { templateUrl: "myDir2.html" /* , controller: ... */ }
}
})
Bonus-Frage:
Sind normale angular Direktiven für Ansichten verfügbar? Zum Beispiel:
Wenn UI-Views-Anweisungen sind, scheint es klar, dass ihre Verwendung anders ist. Wäre es nicht sinnvoll, diese Modelle zu harmonisieren?
Wie wäre es, wenn Sie Angular Inline-Ansichten des UI-Routers verwenden, um auf Anweisungen zu verweisen?
Angenommen, Sie haben eine Direktive für eine Tabelle, die CRUD-Operationen für Benutzerkonten verarbeitet. Wir werden sagen, die Direktive heißt user-admin
. Unsere Routendatei würde folgendermaßen aussehen:
.state('users', {
url: '/users',
template: "<user-admin>"
});
Das würde dir viele nette Dinge bringen:
Nach einigem Nachdenken/Korrespondenz, hier ist meine Schlussfolgerung:
I-Ansichten definieren Container und Zustände definieren, was in diesen Containern passiert
Wenn Sie einem Element eine ui-view='containerName'
- Direktive zuweisen, richten Sie einen Container ein, der etwas enthält. Sie haben noch nichts darüber gesagt, was da reingeht.
Wenn Sie Ihre $stateProvider.state(...)
-Definitionen erstellen, geben Sie an, was in diesen Containern enthalten ist:
$stateProvider.state('someState', {
views: {
"containerName": { templateUrl: "someContents.html" /* , controller: ... */ },
"container2": { templateUrl: "otherContents.html" /* , controller: ... */ }
}
})
Können Sie alle herkömmlichen Direktivenfunktionen (Transclude-, Replace-, Isolate-Scoping-, Compile-/Linking-Funktionen) mit Ihren UI-Views verwenden? Ich bin mir nicht sicher. Beispielsweise:
$stateProvider.state('someState', {
views: {
"containerName": {
templateUrl: "someContents.html",
scope: { localVar: "@" }, // can you
transclude: true, // do this?
controller: function(){}
},
"container2": { templateUrl: "otherContents.html" /* , controller: ... */ }
}
})
Zusammenfassend scheint es, als ob jede Option ihre Nachteile hat. Direktiven verfügen über einige zusätzliche Funktionen. Die Benutzeroberflächenansichten sind jedoch austauschbar und können mit Routen verknüpft sein.
Es scheint, dass Sie so etwas relativ ungestraft tun können:
$stateProvider.state('general', {
url: '/general',
views: {
main: {
template: '<general-directive></general-directive>'
}
}
});
**In Config function:**
.state('list', {
url:'/list',
template:'<user-info-table></user-info-table>',
controller:'UserInfoTableController',
});
**In Directive:**
angular.module('UserInfo').directive("userInfoTable", function() {
return {
templateUrl:'templates/UserInfoTable.html',
restrict:'EA',
};
});