Ich erstelle eine dynamische Web-App mit AngularJS. Ist es möglich, mehrere ng-view
auf einer einzigen Vorlage zu haben?
Ich erstelle eine dynamische Web-App mit AngularJS. Ist es möglich, mehrere ng-view
auf einer einzigen Vorlage zu haben?
Antworten:
Sie können nur eine haben ng-view
.
Sie können ihren Inhalt auf verschiedene Weise ändern: ng-include
, ng-switch
oder Mapping verschiedene Controller und Vorlagen durch die routeProvider.
ng-show
und zu definieren ng-hide
und ihre Sichtbarkeit mithilfe von Variablen zu steuern? Weil ich manchmal mehrere Komponenten verstecken / anzeigen möchte
UI-Router ist ein Projekt, das helfen kann: https://github.com/angular-ui/ui-router Eine seiner Funktionen sind mehrere benannte Ansichten
UI-Router hat viele Funktionen und ich empfehle Ihnen, ihn zu verwenden, wenn Sie an einer erweiterten App arbeiten.
Überprüfen Sie Dokumentation von Multiple Benannte Ansichten hier .
Ich glaube, Sie können es erreichen, indem Sie nur Single haben ng-view
. In der Hauptvorlage können Sie ng-include
Abschnitte für Unteransichten haben und dann im Hauptcontroller Modelleigenschaften für jede Untervorlage definieren. Damit sie automatisch an ng-include
Abschnitte gebunden werden. Dies ist dasselbe wie mit mehrerenng-view
Sie können das in der Dokumentation angegebene Beispiel überprüfenng-include
Wenn Sie im Beispiel die Vorlage aus der Dropdown-Liste ändern, wird der Inhalt geändert. Nehmen wir hier an, Sie haben einen Hauptinhalt ng-view
und anstatt Unterinhalte manuell durch Auswahl der Dropdown-Liste auszuwählen, tun Sie dies wie beim Laden der Hauptansicht.
ng-include
Dokumentation , aber es ist kein wünschenswertes Muster der Anwendungsarchitektur, UI-Router ist die richtige Art von Lösung.
Mit dem regulären ng-view
Modul können Sie nicht mehr als eine dynamische Vorlage haben.
Mit diesem Projekt können Sie dies jedoch tun (suchen nach ui-router
).
Es ist möglich, mehrere oder verschachtelte Ansichten zu haben. Aber nicht von ng-view.
Das primäre Routing-Modul in Angular unterstützt nicht mehrere Ansichten. Sie können aber auch einen UI-Router verwenden. Dies ist ein Modul eines Drittanbieters, das Sie über Github, Angular-UI / UI-Router, https://github.com/angular-ui/ui-router erhalten können . Derzeit wird auch eine neue Version von ngRouter (ngNewRouter) entwickelt. Es ist im Moment nicht stabil. Deshalb biete ich Ihnen ein einfaches Startbeispiel mit UI-Router. Mit ihm können Sie Ansichten benennen und angeben, welche Vorlagen und Controller zum Rendern verwendet werden sollen. Mit $ stateProvider sollten Sie angeben, wie Ansichtsplatzhalter für einen bestimmten Status gerendert werden sollen.
<body ng-app="main">
<script type="text/javascript">
angular.module('main', ['ui.router'])
.config(['$locationProvider', '$stateProvider', function ($locationProvider, $stateProvider) {
$stateProvider
.state('home', {
url: '/',
views: {
'header': {
templateUrl: '/app/header.html'
},
'content': {
templateUrl: '/app/content.html'
}
}
});
}]);
</script>
<a ui-sref="home">home</a>
<div ui-view="header">header</div>
<div ui-view="content">content</div>
<div ui-view="bottom">footer</div>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-ui-router/release/angular-ui-router.js">
</body>
Für dieses Beispiel müssen Sie auf anglejs und angle-ui.router verweisen.
$ bower install angular-ui-router
Sie können nicht mehrere ng-Ansicht haben. Unten ist mein Anwendungsfall, in dem ich meine Anforderung gelöst habe. Ich wollte ein Verhalten mit Registerkarten in meinem Modelldialog haben. Ich hatte ein Problem, als ich auf Registerkarten mit Hyperlink klickte, die Router-Links aufrufen. Ich habe dies mit Button und CSS für Tabs gelöst. Wenn der Benutzer auf die Registerkarte klickt, wird tatsächlich kein Hyperlink aufgerufen, der immer den ng-Router aufruft. Wenn der Benutzer auf die Registerkarte klickt, wird eine Methode aufgerufen, bei der ich HTML dynamisch lade. Unten ist die Funktion beim Klicken auf die Registerkarte
self.submit = function(form) {
$templateRequest('resources/items/employee/test_template.html').then(function(template){
var compiledeHTML = $compile(template)($scope);
$("#d").replaceWith(compiledeHTML);
});
Benutzer $ templateRequest. Fügen Sie auf der Seite test_template.html Ihren HTML-Inhalt hinzu. Dieser HTML-Inhalt wird an Ihren Controller gebunden.