Как запустить компонентное приложение Angular 1?
Используя угловой 1.6, вот компоненты, которые мне нужны:
+-------------------+
|side| |
|bar | |
|... | view |
|... | |
|... | |
+-------------------+
- боковая панель: расположена слева. используя ng-repeat и обновляет динамически.
- вид: остальная часть приложения. шаблон статический, но содержимое меняется при нажатии на боковую панель.
когда пользователь нажимает на каждый список <li>
боковой панели, он обновляет вид. только просмотр контента / модели изменится. не шаблон HTML.
Важно: я просто не хочу писать код на <body>
, Хотелось бы иметь боковую панель в одном html-файле и просматривать в другом, связанном с их контроллерами, и рендерить все приложение через ng-view
в <body>
,
Боковая панель обновляется динамически, так что я не могу указать состояние в config() для каждого.
любая другая стандартная архитектура приветствуется.
1 ответ
Как уже упоминалось в комментариях, есть несколько вариантов архитектуры и структуры, которые можно сделать для реализации того типа шаблонов, который вы ищете. Я приведу базовый пример, основанный на том, что я использовал в прошлом с angular, используя ui-router и дочерние / вложенные представления.
Допустим, у вас есть index.html вроде:
<body>
<div ui-view="header" class="header"></div>
<div ui-view="main" class="main"></div>
<div ui-view="footer" class="footer"></div>
</body>
Страница индекса имеет только макет для самого высокого уровня представления, а именно заголовок, содержимое и нижний колонтитул. Если вам не нужны верхний и нижний колонтитулы, вы можете просто проигнорировать / удалить их. Теперь макет, который вы ищете, с боковой панелью слева и содержимым справа, будет размещен в главном окне. Чтобы сделать это, давайте объявим еще одну страницу, которая определит эту структуру, назовите ее landing.html (для простоты используйте bootstrap):
<div class="container-fluid">
<div class="row landingContainer">
<div class="col-md-2 col-sm-4 col-xs-3 sidebarSection">
<div class="row item" ng-click="landing.changePage('content1')">
<span>Show Content 1</span>
</div>
<div class="row item" ng-click="landing.changePage('content2')">
<span>Show Content 2</span>
</div>
<div class="row item" ng-click="landing.changePage('content3')">
<span>Show Content 3</span>
</div>
</div>
<div class="col-md-10 col-sm-8 col-xs-9 contentSection">
<div ui-view="content"></div>
</div>
</div>
</div>
Вы можете думать об этой странице как о корне вашего макета. Страница разделена на левый и правый раздел с помощью столбцов начальной загрузки. Левая сторона содержит список всех ваших просмотров контента. Вы можете использовать li, я просто предпочитаю div. Правая сторона будет там, где находится динамическая часть страницы, где содержимое будет меняться в зависимости от элемента, выбранного на боковой панели. Каждый компонентный вид является дочерним по отношению к целевой странице, он наследует все функции родительского элемента, а затем добавляет свой собственный контент в представление пользовательского интерфейса, аналогично тому, как landing.html добавляет свой контент в основное пользовательское представление. Теперь давайте взглянем на конфигурацию ui-router, которая делает всю эту работу.
function routerConfig($stateProvider, $urlRouterProvider) {
$stateProvider
.state('landing', {
url: '/landing',
views: {
'header': {
templateUrl: 'app/components/header/headerPrivate.html',
controller: 'HeaderController',
controllerAs: 'header'
},
'main': {
templateUrl: 'app/landing/landing.html',
controller: 'LandingController',
controllerAs: 'dashboard'
},
'footer': {
templateUrl: 'app/components/footer/footer.html',
controller: 'FooterController',
controllerAs: 'footer'
}
}
})
.state('landing.content1', {
url: '/content1',
views: {
'content': {
templateUrl: 'app/content1/content1.html',
controller: 'Content1Controller',
controllerAs: 'content1'
}
}
})
.state('landing.content2', {
url: '/content2',
views: {
'content': {
templateUrl: 'app/content2/content2.html',
controller: 'Content2Controller',
controllerAs: 'content2'
}
}
})
.state('landing.content3', {
url: '/content3',
views: {
'content': {
templateUrl: 'app/content3/content3.html',
controller: 'Content3Controller',
controllerAs: 'content3'
}
}
})
$urlRouterProvider.otherwise('/');
}
Здесь вы заметите, что маршрут целевой страницы определяет конфигурацию для 3 основных видов: верхнего, главного и нижнего колонтитулов. Путь URL будет / посадка. Затем content1, content2 и content3 определяются как дочерние, вложив их в посадку с использованием точечной нотации: landing.content1. Пути URL для каждого дочернего элемента затем будут преобразованы в / Landing/ Content1, / Landing/ Content2, Landing/ Content3. Так что теперь, когда вы переходите в эти места, только контент для этого конкретного дочернего элемента будет вложен в пользовательский интерфейс "содержимого" целевых страниц, а оставшийся макет страницы останется прежним.
Для завершения, вот как может выглядеть контроллер посадки:
function LandingController($state) {
var vm = this;
vm.changePage = function(page){
$state.transitionTo('landing.'+page, null, null);
}
}