Buduję dynamiczną aplikację internetową przy użyciu AngularJS. Czy można mieć wiele ng-view
na jednym szablonie?
Buduję dynamiczną aplikację internetową przy użyciu AngularJS. Czy można mieć wiele ng-view
na jednym szablonie?
Odpowiedzi:
Możesz mieć tylko jedną ng-view
.
Można zmienić jego treść na kilka sposobów: ng-include
, ng-switch
lub mapowanie różne kontrolery i szablony poprzez routeProvider.
ng-show
i ng-hide
oraz kontrolować ich widoczność za pomocą zmiennych? Ponieważ czasami chciałbym ukryć / pokazać wiele komponentów
UI-Router to projekt, który może pomóc: https://github.com/angular-ui/ui-router Jedną z jego funkcji jest wiele nazwanych widoków
UI-Router ma wiele funkcji i polecam korzystanie z niego, jeśli pracujesz nad zaawansowaną aplikacją.
Sprawdź dokumentację dotyczącą wielu nazwanych widoków tutaj .
Wierzę, że możesz to osiągnąć mając singiel ng-view
. W głównym szablonie możesz mieć ng-include
sekcje dla podwidoków, a następnie w głównym kontrolerze zdefiniuj właściwości modelu dla każdego szablonu podrzędnego. Aby automatycznie wiązały się z ng-include
sekcjami. To to samo, co posiadanie wielung-view
Możesz sprawdzić przykład podany w ng-include
dokumentacji
w przykładzie zmiana szablonu z listy rozwijanej powoduje zmianę treści. Tutaj załóżmy, że masz jeden główny ng-view
i zamiast ręcznie wybierać zawartość podrzędną, wybierając listę rozwijaną, robisz to tak, jak podczas ładowania widoku głównego.
ng-include
dokumentacji , ale nie jest to pożądany wzorzec architektury aplikacji, UI-Router jest właściwym rozwiązaniem.
Używając zwykłego ng-view
modułu nie możesz mieć więcej niż jednego dynamicznego szablonu.
Jednak ten projekt umożliwia ci to (szukaj ui-router
).
Możliwe jest posiadanie wielu lub zagnieżdżonych widoków. Ale nie przez ng-view.
Główny moduł routingu w trybie kątowym nie obsługuje wielu widoków. Ale możesz użyć routera ui. To jest moduł innej firmy, który można uzyskać za pośrednictwem Github, angular-ui / ui-router, https://github.com/angular-ui/ui-router . Obecnie opracowywana jest również nowa wersja ngRouter (ngNewRouter). W tej chwili nie jest stabilny. Podaję więc prosty przykład uruchomienia z routerem ui. Za jego pomocą możesz nazwać widoki i określić, które szablony i kontrolery mają być używane do ich renderowania. Używając $ stateProvider, należy określić, jak symbole zastępcze widoku mają być renderowane dla określonego stanu.
<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>
Musisz odwołać się do angularjs i angular-ui.router dla tej próbki.
$ bower install angular-ui-router
Nie możesz mieć wielu widoków ng. Poniżej znajduje się mój przypadek użycia, w którym rozwiązałem swoje wymagania. Chciałem mieć zachowanie kart w moim oknie dialogowym modelu. Miałem problem z klikaniem zakładek zawierających hiperłącze, które wywoływały łącza routera. Rozwiązałem to za pomocą przycisku i css dla kart. Kiedy użytkownik kliknie kartę, w rzeczywistości nie wywoła żadnego hiperłącza, które zawsze wywoła router ng-router. Kiedy użytkownik kliknie kartę, wywoła metodę, w której dynamcilly ładuję html. Poniżej znajduje się funkcja po kliknięciu karty
self.submit = function(form) {
$templateRequest('resources/items/employee/test_template.html').then(function(template){
var compiledeHTML = $compile(template)($scope);
$("#d").replaceWith(compiledeHTML);
});
Użytkownik $ templateRequest. Na stronie test_template.html dodaj treść html. Ta zawartość html zostanie powiązana z twoim kontrolerem.