Angular UI Router state.go参数在stateChangeStart中不可用

时间:2014-08-26 10:10:04

标签: angular-ui-router

我使用Angular UI路由器,我需要使用state.go方法发送参数。像这样:

$state.go('myState', { redirect : true });

我还需要在事件stateChangeStart中检查该参数。像这样:

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
    //redirect parameter is not available here.
    //should be in toParams right?
}

编辑:这是我的州定义:

    $stateProvider.state('customer.search', {
        url: '/search',
        views: {
            "right-flyover@": {
                templateUrl: 'customer/search/search.tpl.html',
                controller: 'CustomerSearchCtrl'
            }
        },
        data: {
            pageTitle: 'Sök användare',
            hidden: true
        }
    });

3 个答案:

答案 0 :(得分:9)

ui-router将传递为州层次结构定义的参数 - 我们正在导航到。请检查:

URL Parameters (引用:)

通常,URL都有动态部分,称为参数。有几个选项可用于指定参数。基本参数如下所示:

$stateProvider
    .state('contacts.detail', {
        url: "/contacts/:contactId",
        templateUrl: 'contacts.detail.html',
        controller: function ($stateParams) {
            // If we got here from a url of /contacts/42
            expect($stateParams).toBe({contactId: 42});
        }
    })

因此,如果你想使用 param redirect,你的州应该是这样的:

$stateProvider.state('customer.search', {
    url: '/search/:redirect',
    ...        
});

然后我们可以使用:

$state.go('customer.search', { redirect : true });

这将成为$statePrams

的一部分

但也许您尝试使用已发送的选项,而不是参数:

选项

  

Object - 如果传递了Object,则object是一个选项哈希。支持以下选项:

  • location布尔值或"替换" (默认为true),如果为true将更新位置栏中的url,如果为false则不会。如果字符串"替换",将更新网址并替换上一条历史记录。
  • inherit Boolean(默认为true),如果为true,则从当前url继承url参数。
  • 相对stateObject(默认$ state。$ current),当使用相对路径转换时(例如' ^'),定义哪个状态是相对的。
  • notify Boolean(默认为true),如果为true,则广播$ stateChangeStart和$ stateChangeSuccess事件。
  • reload v0.2.5布尔值(默认为false),如果为true,则强制转换,即使状态或参数没有改变,也就是重新加载相同的状态。它与reloadOnSearch不同,因为当你想在一切都相同时强制重新加载时你会使用它,包括搜索参数。

那将是第三个参数(重新加载而不是重定向)

$state.go('myState', null, { reload: true });

答案 1 :(得分:1)

我最近通过使用cache属性isStateProvider解决了这个问题并将其设置为false 像

 .state('home.stats', {
        cache: false,
        url:'/stats',
        templateUrl: 'views/stats.html',
        controller: 'StatsCtrl',
        controllerAs: 'stats'
      })

答案 2 :(得分:0)

$ state.go实际上会返回一个承诺,因此您可以执行以下操作:

$state.go('myState').then(() => { 
  if (redirect) {
    // do something
  }
});

我意识到这不是我正在寻找的问题的一般解决方案,但它让我完成了工作。如果需要重复使用逻辑,可以轻松地将它包装在$ state对象的方法中。