2015-08-31 5 views
4

У меня проблема с вложенными представлениями в ui-router.Предотвратить перезагрузку родительского контроллера в ui-router

Моя раскладка:

 
site.search 
----------------- 
site.search.runs 
----------------- 
site.search.runs.scheme 
----------------- 
site.search.runs.scheme.payment 
----------------- 

Я не хочу, чтобы изменить URL, поэтому я использую $state.go('', {}, {location:false}); Я также использую $stage.go('^'...) для вернуться к родителю.

Но когда я нажимаю кнопку «Назад» на сайте site.search.runs.scheme.payment или site.search.runs.scheme - также перезагружается контроллер site.runs (я не использую {reload: true}).
Как предотвратить перезагрузку родительского контроллера верхнего уровня?
Я нашел проблему, такую ​​как моя https://github.com/angular-ui/ui-router/issues/2096
Может ли кто-нибудь мне помочь?

Моя конфигурация

$stateProvider 
     .state('site', { 
      abstract: true, 
      url: '', 
      template: '<ui-view/>' 
     }) 
     .state('site.search', { 
      url: '', 
      parent: 'site', 
      controller: 'SearchController', 
      controllerAs: 'search', 
      templateUrl: 'js/search/search.tpl.html' 
     }) 
     .state('site.search.runs', { 
      url: '', 
      parent: 'site.search', 
      params: {back: false, timestamp: 0, search: {}}, 
      controller: 'RunsController as runsCtrl', 
      templateUrl: 'js/runs/runs.tpl.html' 
     }) 
     .state('site.search.runs.scheme', { 
      url: '', 
      parent: 'site.search.runs', 
      params: {back: false, run: ''}, 
      controller: 'SchemeController as schemeCtrl', 
      templateUrl: 'js/scheme/scheme.tpl.html' 
     }) 
     .state('site.search.runs.scheme.payment', { 
      url: '', 
      parent: 'site.search.runs.scheme', 
      params: {back: false}, 
      controller: 'PaymentController as payCtrl', 
      templateUrl: 'js/payment/liqpay/payment.tpl.html' 
     }) 
}); 

метод Назад называет это $ state.go ('^', {обратно: истинно}, {место: ложь, наследуйте ложь});

+0

Это невозможно, поскольку вы заменяете содержимое 'ui-view' в каждом новом состоянии. Каждый раз, когда это происходит, вид и контроллеры уничтожаются/восстанавливаются. –

+0

Благодарим вас за быстрый ответ – moro

ответ

0

грязный трюк вы можете сделать, это обернуть код контроллера в, если заявление и сделать что-то вроде этого (это ни в коем случае не лучший способ, но это, безусловно, работает):

// make sure you inject $state 
// and put the if statement inside the main function of your controller 

function RunsController($state) { 
    // var will return something like: site.search.runs.scheme 
    var currentState = $state.current.name; 

    if (currentState === 'site.search.runs') { 
     // in here put the code that would normally be in this controller for site.search.runs 
    } 

} 
0

Зависит когда вы вызываете $ state.go().

Вы можете попробовать уведомить: ложный флаг на спине метода $state.go('^', {back: true}, {location: false, inherit: false, notify: false});

Если Youre пытается вызвать state.go в середине государства уже в переходном периоде, вы должны попробовать $ state.transitionTo(), например, :

$rootScope.$on('$stateChangeStart', function(event, toState) { 
    $state.transitionTo('login'); 
} 

Я обнаружил, что transitionTo не перезагружается мои родительские контроллеры

$state.transitionTo('^', $stateParams, { 
      reload: false, inherit: false, notify: false 
     }); 

родитель свойство на состоянии избыточна если вы используете точечную нотацию, чтобы вызвать проблему, поскольку требуется только одна. Я бы проверял $ state. $ Current, когда вы звоните «назад», чтобы убедиться, что вы действительно являетесь частью детей родителя.

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