保持URL params ui-router

时间:2014-09-23 19:17:15

标签: angularjs angular-ui-router

我有一个在不同应用中有入口点的网络应用。 因此,当用户访问我的应用程序时,他们在URL中有一些参数,如下所示:

http://myapp.com/#/new?param1=value&param2=value2

在我的应用中,我有3-4个标签,每个标签都是自己的状态,可通过ui-sref="state"

访问

问题在于,当我切换到这些状态中的任何一种时,我都会丢失用户最初输入的参数。

简而言之,当我切换状态时,我只想http://myapp.com/#/differentstate?param1=value&param2=value2而不是http://myapp.com/#/differentstate

我不确定如何设置...... 谢谢!

2 个答案:

答案 0 :(得分:10)

在您的角度应用.run()功能内,您可以执行此操作:(您需要DI $rootScope$location

    var locationSearch;

    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
        //save location.search so we can add it back after transition is done
        locationSearch = $location.search();
    });

    $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
        //restore all query string parameters back to $location.search
        $location.search(locationSearch);
    });

答案 1 :(得分:1)

设置$ location.search仅在您保持在同一窗口时有效。要锚定所有链接,您必须手动扩展ui-sref以包含url参数。现在,您的链接可以在新标签中打开"并保留参数。此代码还包括将〜2F和%2F转换为/所以您的链接保持一致的kludge。要做到这一点:

.run(function ($rootScope, $state, $location ) {
  // Url parameters
  var locationSearch = $location.search();
  // Set param1 
  $rootScope.site = {};
  $rootScope.site.param1 = _url_decode_slash(locationSearch.param1);


  // Hack to decode URL params with Slash (/)
  function _url_decode_slash (param) {
      if (!param) return param;
      param = param.replace(/~2F/g, "/"); // Replace all '~2F' to /
      param = param.replace(/%2F/g, "/"); // Replace all '%2F' to /
      return param;
  }
}

然后在index.html中

<a ui-sref="request.add( {param1: site.param1 } )" >