Вкладка с разными контроллерами

В моем приложении angular.js у меня есть представление профиля с различными вкладками, каждое из которых представляет собой вложенное представление со своим собственным контроллером. Что я хочу сделать, так это иметь возможность щелкать назад и вперед по разным вкладкам, но всегда оставаться в виде профиля.

Но каждый раз, когда я нажимаю на одну из вкладок, например, «nested_view_1» с URL-адресом «/nested_view_1» и templateUrl: «nested_view_1.html», он меняет путь на «/nested_view_1» и отображает пустую страницу (потому что я не указал "/nested_view_1" в моем $routeProvider). Только когда я нажимаю «Назад», он показывает содержимое выбранной вкладки внутри моего представления.

Может быть проблема в том, что я использую ui.router и ng-route одновременно.

вот мой app.js файл:

var app = angular.module('app', ['ngRoute', 'ui.router','ui.bootstrap','ui.bootstrap.tpls'])     

app.config(['$routeProvider', '$stateProvider' ,function ($routeProvider, $stateProvider) {

  $routeProvider
    .when('/', {
      templateUrl: '/app/views/home.html',
      controller: 'HomepageCtrl'
    })
    .when('/articles', {
      templateUrl: 'app/views/articles/index.html',
      controller: 'ArticlesCtrl'
    })
    .when('/articles/:id', {
      templateUrl: 'app/views/articles/show.html',
      controller: 'ShowArticleCtrl'
    })
    ... other routes ...

    $stateProvider
      .state('profile', {
        abstract: true,
        url: '/profile',
        templateUrl: "app/views/users/profile.html",
        controller: 'UserShowCtrl'
      })
     .state('nested_view_1', {
       url: '/nested_view_1',
       views: {
         "tabContent": {
           templateUrl: 'app/views/users/sales.html',
           controller: 'UserSalesAreaCtrl'
         }
       }
     })
     .state('nested_view_2', {
       url: "/nested_view_2",
       views: {
         "tabContent": {
           templateUrl: 'app/views/users/buys.html',
           controller: 'UserAreaCtrl'
         }
       }
     })
     .... all the way to nested view 4, in my case
}])

мой взгляд:

<ul class="nav nav-tabs mt-50" >
  <li ng-repeat="t in tabs" class="nav-item" heading="{{t.heading}}"  active="t.active">
    <a ui-sref="{{t.route}}" style="font-weight: 200;" class="nav-link" ng-class="{'active'}" > 
      {{ t.heading }}
    </a>
  </li>
  <div ui-view="tabContent"></div>
</ul>

my UserShowCtrl

angular.module('app').controller('UserShowCtrl', ['$scope', 'user', '$routeParams', '$location', '$state',
  function ($scope, user, $routeParams, $location, $state) { 

  $scope.tabs = [
    { heading: 'nested_view_1', route:'nested_view_1', active:true  },
    { heading: 'nested_view_2', route:'nested_view_2', active:false },
    { heading: 'nested_view_3', route:'nested_view_3', active:false },
    { heading: 'nested_view_4', route:'nested_view_4', active:false }
  ];

}]);

person tvieira    schedule 17.12.2015    source источник


Ответы (1)


Префикс ваших вложенных маршрутов с родительским маршрутом parent.

$stateProvider
      .state('profile', {
        abstract: true,
        url: '/profile',
        templateUrl: "app/views/users/profile.html",
        controller: 'UserShowCtrl'
      })
     .state('profile.nested_view_1', {
       url: '/nested_view_1',
       views: {
         "tabContent": {
           templateUrl: 'app/views/users/sales.html',
           controller: 'UserSalesAreaCtrl'
         }
       }
     })
     .state('profile.nested_view_2', {
       url: "/nested_view_2",
       views: {
         "tabContent": {
           templateUrl: 'app/views/users/buys.html',
           controller: 'UserAreaCtrl'
         }
       }
     })
person Andrew Sheehan    schedule 17.12.2015
comment
Мне также нужно обновить атрибуты маршрута $scope.tabs, он перенаправляет на /profile/nested_view_1, но я продолжаю получать пустую страницу - person tvieira; 17.12.2015
comment
Можете ли вы обновить пример кода, чтобы отразить внесенные вами изменения? - person Andrew Sheehan; 17.12.2015
comment
Я думаю, что вы, вероятно, правы в том, что пытаетесь использовать оба маршрутизатора. В вашем основном макете у вас есть элемент как для ngView, так и для uiView? Оба маршрутизатора требуют разных элементов для отображения страниц. Вероятно, в ваших интересах реорганизовать все ваши маршруты для использования ui-router, а не пытаться смешивать 2 маршрутизатора. - person Andrew Sheehan; 17.12.2015