Подтвердить что ты не робот

Как использовать вкладки Angular ui.bootstrap с помощью ui.router?

Здесь моя первоначальная реализация вкладок ui.bootstrap с использованием ui.router:

<tabset>
  <tab heading="Tab1" select="$state.go('home.tab1')">
    <div ui-view="forTab1"></div>
  </tab>
  <tab heading="Tab2" select="$state.go('home.tab2')">
    <div ui-view="forTab2"></div>
  </tab>
</tabset>

Очень просто, и он работает в основном, но он имеет несколько проблем.

Во-первых, он не работает, если я ввожу URL-адрес в браузер, например. ".../дома/tab1". Проблема, которую я предполагаю, заключается в том, что, хотя ui.router может маршрутизировать в правильное представление, он не знает, чтобы выбрать эту вкладку вида.

Во-вторых, если я попытаюсь оставить страницу для состояния на другой странице, это вызовет явную ошибку в логике вкладок. Когда набор вкладок уничтожается, он уничтожает вкладки один за другим. Когда он уничтожает текущую выбранную вкладку, она, похоже, запускает ту же логику, что и при ее удалении, если только эта вкладка будет уничтожена, а не весь набор вкладок. Это заставляет его выбирать одну из других еще не уничтоженных вкладок, из-за чего ui.router переходит в это состояние табуляции, что мешает мне покинуть страницу. (Предположительно, исправление должно заключаться в том, что уничтожение набора вкладок не должно выбирать никаких вкладок во время процесса уничтожения.)

В-третьих, некоторые из видов вкладок могут быть сложными, при этом многие серверные удары во время их создания. Я не хочу уничтожать и воссоздавать их каждый раз, когда я переключаюсь с одной вкладки на другую. Я бы предпочел создать представление табуляции, когда эта вкладка будет сначала выбрана, а затем сохранится, пока я не покину страницу. Выбор ранее просматриваемой вкладки должен просто сделать ее видимой снова, а не повторно создать.

Итак, похоже, мне нужно что-то более сложное и сложное, но что? Заранее благодарим за любые предложения.

Обновление: в FAQ ui.router возникает вопрос о том, как реализовать вкладки. Это указывает на пакет дополнительных услуг, который выглядит многообещающим. Надеюсь, есть способ интегрироваться с вкладками ui.bootstrap. http://christopherthielen.github.io/ui-router-extras/#/sticky

Обновление: вот две реализации, которые работают намного лучше, но все еще не совсем правильные. Первый использует вкладки ui.bootstrap:

<tabset>
  <tab heading="Products" ui-sref=".products" active="$state.includes('home.products')"></tab>
  <tab heading="Users" ui-sref=".users" active="$state.includes('home.users')"></tab>
</tabset>
<div ui-view="home.products" ng-show="$state.includes('home.products')"></div>
<div ui-view="home.users" ng-show="$state.includes('home.users')"></div>

Вторая основана на top.html из примера липких вкладок Chris Thielen:

<div class="navbar navbar-default navbar-static-top" role="navigation">
  <ul class="nav navbar-nav">
    <li ng-class="{active: $state.includes('home.products')}" ><a ui-sref="home.products">Products</a></li>
    <li ng-class="{active: $state.includes('home.users')}" ><a ui-sref="home.users">Users</a></li>
  </ul>
</div>
<div class="tabcontent well-lg" ui-view="home.products" ng-show="$state.includes('home.products')" class="col-sm-6"></div>
<div class="tabcontent well-lg" ui-view="home.users"    ng-show="$state.includes('home.users')"    class="col-sm-6"></div>

Оба из них избегают моих первых двух проблем выше - переход на вкладку с помощью URL-адресов работает, и я могу покинуть страницу, не запуская ошибки с ошибками табуляции (по-видимому, потому, что я не использую "select =" ).

Однако, все еще есть проблема, и это происходит с обеими версиями. Шаблон home.users имеет ui-сетку, и если я сначала перейду на страницу с выбранной вкладкой, сетка будет пустой. Я вижу клиента, запрашивающего данные сетки с сервера, но он не показывает его. Если я перейду на другую вкладку и вернусь, то она отобразит данные (после повторной выборки). Хуже того, это означает, что я не могу заставить home.users быть липким, потому что тогда он застревает в режиме отображения без данных.

4b9b3361

Ответ 1

Самый простой способ - игнорировать все причудливые директивы ui-bootstrap и просто использовать CSS. Тогда вы можете получить что-то очень простое:

<ul class="nav nav-tabs">
    <li ui-sref=".state1" ui-sref-active="active"><a>State 1</a></li>
    <li ng-repeat="type in viewModel.types"
        ui-sref=".typeState({type:type})"
        ui-sref-active="active"><a>{{type}}</a></li>
</ul>

Это приведет к появлению вкладок при сохранении правильных активных состояний. Проблема с использованием директивы <tab-header> заключается в том, что вы не можете чисто инициализировать активное состояние с помощью ui-router $state, поэтому вы можете выделить несколько вкладок при загрузке страницы.

Ответ 2

Вы можете рассмотреть возможность просмотра этого проекта, ui router plus ui bootstrap tabs, который объявляет себя как

Идиотизованные панели вкладок с поддержкой маршрута с помощью Angular.js + Bootstrap 3 + UI Router

Я еще не пробовал, но, безусловно, выглядит многообещающе.

Ответ 3

Просто сделал это в моем проекте. Это предполагает, что ваши маршруты подключены с помощью ui.router. Надеюсь, что это поможет.

<uib-tabset active="active">

    <uib-tab index="0" ui-sref ="tab1" heading="Tab1"></uib-tab>

    <uib-tab index="1" ui-sref="tab2" heading="Tab2"></uib-tab>

</uib-tabset>