38

Я хотел бы использовать AngularJS UI Bootstrap Tabs в моем проекте, но мне нужна его для поддержки маршрутизации.AngularJS UI Bootstrap Вкладки, поддерживающие маршрутизацию

Например:

Tab   URL 
-------------------- 
Jobs  /jobs 
Invoices /invoices 
Payments /payments 

Насколько я могу судить из исходного кода, текущий tabs и pane директивы не поддерживает маршрутизацию.

Что было бы лучшим способом добавить маршрутизацию?

ответ

37

Чтобы добавить маршрутизацию, вы обычно используете директиву ng-view. Я не уверен, что достаточно просто изменить угловой интерфейс, чтобы поддерживать то, что вы ищете, но here's a plunker, показывающий примерно то, что я думаю, что вы ищете (это не самый лучший способ сделать это - надеюсь, кто-то может дать вам лучшее решение или улучшить на этом)

+1

Это лучший ответ. Даже не утруждайтесь указателями на угловое ui-bootstrap; просто реализуйте его с помощью ngRoute. Я на самом деле просто установил [Plunk] (http://plnkr.co/1xA1r2), демонстрируя это, и собирался опубликовать свой собственный ответ, прежде чем я понял, что он такой же, как ваш. – user240515

+0

Мне нравится этот waaay лучше, чем подход Angular UI Bootstrap. Который я не понимаю, так или иначе. Я не вижу реальной причины перестраивать Bootstrap.js в пользовательские угловые директивы. Они должны быть раздельными, чтобы использовать лучшие части как углового, так и бутстрапа. Отказ от ответственности: это чисто мое 2ct. –

+0

Обратите внимание, что если вы перемещаетесь между вкладками, а затем переходите назад (нажмите кнопку «Назад» на клавиатуре), отображается соответствующее представление, но правильной активной вкладки нет? См. Это для решения: http://stackoverflow.com/a/25735997/410937 – atconway

1

вы можете передать свои собственные пары значений пользовательского ключа в определении маршрута и добиться этого. вот хороший пример: http://www.bennadel.com/blog/2420-Mapping-AngularJS-Routes-Onto-URL-Parameters-And-Client-Side-Events.htm

+0

Ссылка только ответы не допускаются. Прочитайте справку об использовании stackoverflow. – jgauffin

+1

Подведите итог решению, чтобы ваш ответ работал без ссылки, и я сниму нижний предел. – user240515

5

У меня также есть это требование, и я делаю что-то подобное ответом, Крис, но я также использую AngularUI router, потому что ngRouter не поддерживает вложенные мнения и возможно у вас будет просмотр содержимого вкладки внутри другого представления (я сделал), и это не будет работать с ng-view.

0

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

$scope.tabs = [ 
      { link : '#/furnizori', label : 'Furnizori' }, 
      { link : '#/total', label : 'Total' }, 
      { link : '#/clienti', label : 'Clienti' }, 
      { link : '#/centralizator', label : 'Centralizator' }, 
      { link : '#/optiuni', label : 'Optiuni' } 
     ]; 

     switch ($location.path()) { 
      case '/furnizori': 
       $scope.selectedTab = $scope.tabs[0]; 
       break; 

      case '/total': 
       $scope.selectedTab = $scope.tabs[1]; 
       break; 

      case '/clienti': 
       $scope.selectedTab = $scope.tabs[2]; 
       break; 

      case '/centralizator': 
       $scope.selectedTab = $scope.tabs[3]; 
       break; 

      case '/optiuni': 
       $scope.selectedTab = $scope.tabs[4]; 
       break; 

      default: 
       $scope.selectedTab = $scope.tabs[0]; 
       break; 
     } 
2

Принимает с использованием UI-маршрутизатор, который отслеживает состояния и отлично работает с вложенными представлениями. Говоря в частности вашего вопроса Bootstrap вкладки есть большая реализация, которая использует пользовательский интерфейс маршрутизатора: UI-Router Tabs

15

Использование данных целевых = «# tab1». Работал для меня

+0

Спасибо, что разрешенный угловой маршрут вызывается при нажатии на вкладку – David

+0

Это отличный ответ, когда на странице вы не видите другие элементы, на которых вы не хотите, чтобы маршрутизация была удалена. +1 :) –

1

Если у вас есть маршрут, называемый настройками, и вы хотите иметь вкладки на этой странице настроек, то это работает.

<div class="right-side" align="center"> 
    <div class="settings-body"> 
     <ul class="nav nav-tabs"> 
      <li class="active"><a data-toggle="tab" href="#!/settings#private_email">Private email</a></li> 
      <li><a data-toggle="tab" href="#!/settings#signature">Signature</a></li> 
      <li><a data-toggle="tab" href="#menu2">Menu 2</a></li> 
     </ul> 

     <div class="tab-content"> 
      <div id="private_email" class="tab-pane fade in active"> 
      <div class="row" ng-controller="SettingsController"> 
       <div> 
        <button class="btn btn-primary" ng-click="activatePrivateEmail()">Activate email</button> 
        <button class="btn btn-danger">Deactivate email</button> 
       </div> 
      </div> 
      </div> 
      <div id="signature" class="tab-pane fade"> 
       <textarea ui-tinymce="tinymceOptions" ng-model="signature"></textarea> 
       <div class="send-btn"> 
       <button name="send" ng-click="" class="btn btn-primary">Save signature</button> 
       </div> 
      </div> 
      <div id="menu2" class="tab-pane fade"> 
      <h3>Menu 2</h3> 
      <p>Some content in menu 2.</p> 
      </div> 
     </div> 
    </div> 
</div> 
+0

Это было бы моим лучшим решением, хотя я просто удаляю #! в href = "#!/settings # private_email". Преимущество в том, что вам не нужно добавлять какой-либо js-код, только чистую навигацию #. –

0

У меня есть вкладки с маршрутизацией, работающие следующим образом.

Он может делать все, что вам нужно, от динамических вкладок, и на самом деле это очень просто.

  • Вкладка с ui-view, так что он может динамически загружать шаблоны,
  • маршрутизации
  • Обновления в URL
  • Истории Установить состояние
  • При непосредственной навигации по маршруту с вкладками, закладка правильно помечается как active.

Определить вкладки с параметром в маршрутизаторе

.state('app.tabs', { 
    url   : '/tabs', 
    template : template/tabs.html, 
}) 
.state('app.tabs.tab1', { 
    url   : '/tab1', 
    templateUrl : 'template/tab1.html', 
    params  : { 
     tab   : 'tab1' 
    } 
}) 
.state('app.visitors.browser.analytics', { 
    url   : '/tab1', 
    templateUrl : 'template/tab2.html', 
    params  : { 
     tab   : 'tab2' 
    } 
}) 

шаблон вкладок (tabs.html) является

<div ng-controller="TabCtrl as $tabs"> 
    <uib-tabset active="$tabs.activeTab"> 
     <uib-tab heading="This is tab 1" index="'tab1'" ui-sref="app.tabs.tab1"></uib-tab> 
     <uib-tab heading="This is tab 2" index="'tab2'" ui-sref="app.tabs.tab2"></uib-tab> 
    </uib-tabset> 
    <div ui-view></div> 
</div> 

Что в паре с очень простым контроллером для получение текущей активной вкладки:

app.controller('TabCtrl', function($stateParams) { 
    this.activeTab = $stateParams.tab; 
}) 
Смежные вопросы