Как правильно сделать вкладочное приложение в angularjs?

Приложение состоит из нескольких вкладок, котрые добавляются при запуске или в процессе работы.
Пользователь должен иметь возможность в любой момент переключаться между вкладками и возвращаться обратно.
Вкладки содержат кучу вьюх со сложноидентифицируемым состоянием. Например, форма для заполнения, или таблица результатов запроса с выделениями.

Насколько я понимаю, ui-router, sticky states, deep state redirect с таким не справятся, и хранить состояние нужно прямо в DOM и связанными с ним контролерами. А сами вкладки делать в духе ui-bootstrap, через директивы tabset/tab или руками через ng-show.

Вопрос - как в этом случае создавать вкладки с вложенными вьюхами?
И как создавать их из вложенных внутрь вкладок контроллеров?

Upd. Вообще, если я сделаю что-то типа
<tabset>
<tab ng-repeat="tab in ctrl.tabs"><ng-include src="tab.src"></tab>
</tabset>

При добавлении/удалении вкладок из контроллера (this.tabs) при каких условиях не будут перерендеряться все вообще вкладки?

Upd2. Чтобы создавать вкладки можно было отовсюду, очевидно, нужен сервис, с реестром вкладок и всё такое. Но стобы присобачить это к вьюхе из предыдущего Upd, нужен контроллер, который получается довольно странным:
.service('TabService', function() {
    this.tabs = []; /* все вкладки приложения */
    this.openTab = function() { ... };
    this.closeTab = function() { ... };
})
.controller('TabsCtrl', function TabCtrl(TabService) { 
    this.tabs = TabService.tabs; /* чтобы сделать ng-repeat */
    this.openTab = TabService.openTab; /* чтобы сделать где-нибудь ng-click="ctrl.openTab()" */
})

Upd3. При создании вкладки нужно передавать паарметры контрллеру которы будет ею рулить.
Если создавать методом
<tab ng-repeat="tab in ctrl.tabs"><ng-include src="tab.src"></tab>

И tab.src указывать на кусок html в котором приаттачен контроллер - как он может достучаться до внешнего scope? И где вообще в таком раскладе сделать такой scope?
  • Вопрос задан
  • 5569 просмотров
Решения вопроса 1
qmax
@qmax Автор вопроса
программер
Рабочий код: plnkr.co/edit/lnijKg?p=info
Идея:
* Использовать ng-repeat для ренеринга вкладок
* Использовать ui-router чтобы привязать состояния ко вкладкам и директивам с их содержимым
* Игнорировать ui-view, и контроллеры с темплэйтами
* Перехватывать переходы состояния для переключения вкладок из сервиса.
* Контент вставлять с помощью хитрожопой перекомпилирующей прокси-директивы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Serhioromano
@Serhioromano
Web Developer
Насколько я понимаю, ui-router, sticky states, deep state redirect с таким не справятся


В полне даже справятся.

Я бы не делал вкладок как просто вкладки. Я бы сделал псевдо вкладки. Тоесть внешний вид как вкладки но у каждой вкладки свой шаблон.

jsfiddle.net/ktc067x1

В этом примере ты увидешь как можно обработать каждую вкладку отдельным шаблоном. Закоментированый код templateUrl грузит файл шаблона а для примера я использую template.

Но наверно захочется с каждой вкладной свой кнотролер. Тогда можно так

controllerProvider: function($stateParams) {
      var ctrlName = "Controller" + $stateParams.tab;
      return ctrlName;
}


Тогда можно для каждой вкладки свой контроллер

app
    .controller('Controller1', function(){})
    .controller('Controller2', function(){})


И все будет красиво и акуратно.
Ответ написан
AMar4enko
@AMar4enko
ui-router для вкладок вполне, может вы что-то упустили?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект