2013-04-30 16 views
18

Chciałbym stworzyć stronę wzorcową, czyli stronę główną, która będzie używana we wszystkich widokach aplikacji.Koncepcja strony wzorcowej w AngularJS?

Na przykład nawigacja po lewej i nawigacja po wierzchu. Ta nawigacja powinna być wyświetlana we wszystkich widokach, ilekroć URL zmienia się w aplikacji.

enter image description here

Zgodnie ng widzenia tylko tynki otrzymać częściowy widok i zastąpienie poprzedniego widoku. Na powyższym obrazku cała moja nawigacja po lewej i na górze powinna być wyświetlana za pomocą regulatora kątowego.

kod Kontroler

angular.module('modelDemo').controller("authCtrl", ['$scope', function($scope) { 
     $scope.list; 
}]); 

Proszę dać mi znać, jak mogę to osiągnąć

Odpowiedz

7

widok ng powinien być w stanie to zrobić dobrze. Zachowaj nienaruszoną nawigację górną/nawigację po lewej stronie html i korzystaj z widoku ng dla różnych obszarów wyświetlania. http://docs.angularjs.org/api/ng.directive:ngView

Aby używać kontrolera z górnej nawigacji wewnątrz NG-view można użyć $ rodzica, aby uzyskać dostęp do tego zakresu: https://stackoverflow.com/a/14700326/390330

Fiddle dla zakresu dominującej: http://jsfiddle.net/ezhrw/2/

<button ng:click="$parent.letter = greek">Assignment expression {{ greek }}</button> 
+0

Problem polega na tym, że jeśli dodasz kontroler do głównego widoku, nie mam dostępu do danych z kontrolera. Myślę, że wynika to z ng-view i $ routeProvider. Ponieważ $ routeProvider zawiera kontroler, który ma być użyty do renderowania danych – niran

+0

Zakres w nowym kontrolerze jest dzieckiem z zakresu kontrolera nadrzędnego. Oto lepszy przykład, który stworzyłem, aby wyjaśnić związek między rodzicem a dzieckiem: http://jsfiddle.net/basarat/QQNRD/ – basarat

+0

Działa to dobrze, gdy używasz kontrolera bezpośrednio na stronie głównej i nie ma wtyczki $ routProvider. Jeśli używasz $ routProvider, otrzymuje określony kontroler i renderuje go. Tutaj próbuję użyć wspólnego kontrolera, który wyświetla całą górną i lewą nawigację, niezależnie od zmian widoku – niran

9

Można użyć trasą kątową lub rytmem kątowym i ustawieniem urządzenia master, wykonując następujące czynności:

  • Krok 1. Zrób swój index.html Twoja strona wzorcowa.
  • Krok 2. Dodać <header>, <footer>, <aside>, <div> itp przedstawieniu szablony za pomocą ng-include
    • UWAGA: left i top nawigacja będzie częścią
  • Krok 3. Zawartość widoku będzie renderowana przy użyciu atrybutu dyrektywy ng-view lub ui-view
  • Krok 4. Użyj swojego modułu app.config() do skonfigurowania stron podrzędnych

enter image description here

Źródło:

1

Próbowałem stworzyć tę samą koncepcję, ale potrzebowałem sposobu na zdefiniowanie symboli zastępczych. Zacząłem eksperymentować w Plnkr.co i jak dotąd uciekłem się do korzystania z LayoutManager, który sam się wyszukuje z ustawień w obiekcie routeProvider.

Oto przykład: http://embed.plnkr.co/4GPDfTSQCuqukJE7AniZ/

Zobaczysz przykład, jak wiele tras korzystać z tego samego nagłówka i stopki, nie zawierają przykład z paska bocznego.

Pozwól mi wyjaśnić LayoutManager.

Chciałem mieć zastępcze, które mogą być przesłonięte. W tym przykładzie mam pasek narzędzi, który zawiera tytuł i zapewnia spację po prawej stronie tytułu dla dodatkowych elementów paska narzędzi. Daje to widokom możliwość dodania dodatkowej funkcjonalności.

Wszystko to jest obsługiwane przez LayoutManager. LayoutManager to usługa odczytująca właściwości układu ustawione na $ routeProvider. Chciałem to zaimplementować w taki sposób, aby wszystko było czyste i niezależne od trasy. LayoutManager jest wstrzykiwany do dyrektywy dotyczącej paska narzędzi. Dyrektywa paska narzędzi przenosi jego właściwości zakresu do LayoutManager.

Z kolei LayoutManager ma zależność od routeProvider oraz od zdarzenia rootScope $ routeChange.

Jestem bardzo nowy w Angular, otwarty na sugestie.

+0

ładne podejście, ale wygląda na to, że dodajesz podmenu. Nie zmienia się górny pasek narzędzi – niran

+0

To prawda. Powinienem nazwać to podrzędnym paskiem narzędziowym, a nie głównym. – alettieri

1

nie widziałem żadnego problemu, jeśli używasz bootstrap następnie można użyć łatwo podzielić ekran jak chcesz

<div class="row"> 
    <div class="col-lg-3"> 
     Left panel 
    </div> 
    <div class="col-lg-9" style="border:1px solid #999; overflow-y:auto"> 
     <div> Top Banner </div> 

     <!-- Main view to render all the page --> 
     <div ui-view> </div> 

    </div> 
</div> 

Jeśli chcesz pełną wersję demo i kod na potem zobaczyć this link

Edited : 3 listopada 2016:

Jeśli używasz ui-routera, możemy użyć stanu abstrakcyjnego użytkownika, aby utworzyć różne strony wzorcowe.

Nie trzeba grać pokazać/ukryć, ng-ale tylko jeśli prawidłowo zdefiniować routing ze sobą stron wzorcowych i stron podrzędnych

Better to see the detail

+0

To naprawdę dobre rozwiązanie. Jedno jednak: prawdopodobnie będziesz chciał, aby dwa panele (kolumny) miały tę samą wysokość. Rzuć okiem na ten artykuł, aby wyjaśnić, jak to zrobić: http://www.minimit.com/articles/solutions-tutorials/bootstrap-3-responsive-columns-of-same-height (Dostałem tę wskazówkę od znakomitego "Responsive Websites With Bootstrap 3" samouczek dotyczący PluralSight.) –

1

Wiem, że to stary wątek, ale myśl należy zauważyć, że od wersji Angular 1.5+ wprowadzono komponenty. Zamiast zajmować się trasami z nazwanymi widokami i wszystkimi tymi bzdurami lub używając ngInclude, powinieneś używać komponentu nagłówka i komponentu stopki. Po prostu dodaj je do pliku index.html (lub jakkolwiek nazwałeś swój szablon HTML) i voila.

Na przykład (to jest przy użyciu kątowa Materiał i brakuje modułu układu, ale mam nadzieję, że masz punkt)

1. Dodano index.html

<layout-header></layout-header> 

2. header.component.js (nie potrzebujesz tego wszystkiego, ale myślę, że to jest przydatne)

(function() { 
'use strict'; 
angular 
    .module('layout') 
    .component('layoutHeader', { 
     templateUrl: 'layout/header.html', 
     bindings: {}, 
     controller: Controller 
    }); 

Controller.$inject = []; 
function Controller() { 
    var ctrl = this; 

    initialize(); 

    //////////////////// 

    function initialize(){ 

    } 

} 
}()); 

3. nagłówek.html

<md-toolbar> 
<div class="md-toolbar-tools"> 
    <h2> 
     <span>Really Awesome Title!!!!</span> 
    </h2> 
    <span flex></span> 

    <md-button class="md-icon-button" aria-label="More"> 
     <md-icon class="material-icons">more_vert</md-icon> 
    </md-button> 
</div> 
</md-toolbar> 
Powiązane problemy