2016-05-26 5 views
1

Этот код функциональный, но он может работать лучше. Мой вопрос:Угловой маршрутизатор, вызывающий контроллер много раз

Как я могу вставить navDetalle или другие представления во многих состояниях без контроллера вызова.

(function() { 
 
    'use strict'; 
 

 
    angular 
 
    .module('miApp') 
 
    .config(routerConfig); 
 

 
    var nav = { 
 
    templateUrl: 'app/nav/nav.html', 
 
    controller: 'NavController', 
 
    controllerAs: 'nav' 
 
    }; 
 
    var navInter = { 
 
    templateUrl: 'app/nav/navInter.html', 
 
    controller: 'NavController', 
 
    controllerAs: 'nav' 
 
    }; 
 
    var navDetalle = { 
 
     templateUrl: 'app/navDetalle/navDetalle.html', 
 
     controller: 'NavDetalleController', 
 
     controllerAs: 'navDetalle'   
 
    }; 
 
    /** @ngInject */ 
 
    function routerConfig($stateProvider, $urlRouterProvider) { 
 

 
    $stateProvider 
 
     .state('home', { 
 
     url: '/', 
 
     views: { 
 
      // the main template will be placed here (relatively named) 
 
      'nav': nav, 
 
      'carousel': { 
 
       templateUrl: 'app/carousel/carousel.html', 
 
       controller: 'CarouselController', 
 
       controllerAs: 'carousel' 
 
      }, 
 
      'footer':{ 
 
       templateUrl: 'app/footer/footer.html' 
 
      } 
 
     } 
 
     }) 
 
     .state('detalle', { 
 
     url: '/detalle/:idDetalle', 
 
     views:{ 
 
      'nav': navInter, 
 
      'detalle': {  
 
       templateUrl: 'app/detalle/detalle.html', 
 
       controller: 'DetalleController', 
 
       controllerAs: 'detalle' 
 
      }, 
 
      'navdetalle': navDetalle, 
 
      'footer':{ 
 
       templateUrl: 'app/footer/footer.html' 
 
      } 
 
     } 
 

 
     }) 
 
     .state('resumen', { 
 
     url: '/resumen', 
 
     views:{ 
 
      'nav': navInter, 
 
      'navdetalle': navDetalle, 
 
      'footer':{ 
 
       templateUrl: 'app/footer/footer.html' 
 
      } 
 
     } 
 

 
     }) 
 
     .state('success', { 
 
     url: '/success', 
 
     views:{ 
 
      'nav': navInter, 
 
      'success': {  
 
       templateUrl: 'app/success/success.html', 
 
       controller: 'SuccessController', 
 
       controllerAs: 'success' 
 
      }, 
 
      'navdetalle': navDetalle, 
 
      'footer':{ 
 
       templateUrl: 'app/footer/footer.html' 
 
      } 
 
     } 
 

 
     }) 
 
     .state('cancel', { 
 
     url: '/cancel', 
 
     views:{ 
 
      'nav': navInter, 
 
      'navdetalle': navDetalle, 
 
      'cancel': {  
 
       templateUrl: 'app/cancel/cancel.html', 
 
       controller: 'CancelController', 
 
       controllerAs: 'cancel' 
 
      }, 
 
      'footer':{ 
 
       templateUrl: 'app/footer/footer.html' 
 
      } 
 
     } 
 

 
     }); 
 

 
    $urlRouterProvider.otherwise('/'); 
 
    } 
 
    
 
})(); 
 

и если у вас есть предложения по другим улучшениям, пожалуйста, комментарий

+0

Что вы подразумеваете, вставив navDetale? –

+0

@ShashankAgrawal navDetalle - это объект для просмотра состояния, этот объект объявляется сверху –

+0

Брота проверить это [выпуск] (https://github.com/angular-ui/ui-router/issues/1800) –

ответ

0

Я не уверен, что это невозможно предотвратить выполнение контроллера каждый раз. Но у меня есть другое решение. Это может сработать. Ionic Framework делают это внутренне, сохраняя состояние контроллера.

Создайте глобальный контроллер и добавьте его в <body> или <html> тег, чтобы его объем мог быть доступен каждый раз.

app.controller('GlobalController', function($scope) { 

    var navDetalleCtrlInstantiated = false; 

    $scope.$on('$stateChangeStart', function(e, toState, toParams) { 
     if (!navDetalleCtrlInstantiated && toState.views && toState.views.navdetalle) { 
      // Do the common logic on controller instantiation 

      // Mark so that we don't have to do the same logic again 
      navDetalleCtrlInstantiated = true; 
     } 
    }); 
}); 

На ваш взгляд:

<body ng-controller="GlobalController"> 
</body> 

И удалить логику из вашего NavDetalleController.

0

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

Смежные вопросы