防止在ui-router中重新加载父控制器

时间:2015-08-31 19:57:07

标签: javascript angularjs angular-ui-router

我在ui-router中遇到嵌套视图的问题。

我的布局是:

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

我不想更改网址,这就是我使用$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'
        })
});

Back方法调用$ state.go('^',{back:true},{location:false,inherit:false});

2 个答案:

答案 0 :(得分:0)

你可以做的一个脏技巧是将控制器代码包装在if语句中并执行类似的操作(这绝不是最好的方法,但它肯定会有效):

// 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
    }

}

答案 1 :(得分:0)

取决于你何时调用$ state.go()。

您可以在后方法top, bottom, left, right

上尝试使用notify:false标记

如果你试图在已经处于转换状态的中间调用state.go,你应该尝试$ state.transitionTo()例如:

$state.go('^', {back: true}, {location: false, inherit: false, notify: false});

我发现transitionTo不会重新加载我的父控制器

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

如果使用点表示法,则状态上的父属性是多余的,因此可能导致问题,因为只需要一个问题。当你打电话给'回'以确保你真的是父母的孩子的一部分时,我会检查$ state。$ current。