我有一个在不同应用中有入口点的网络应用。 因此,当用户访问我的应用程序时,他们在URL中有一些参数,如下所示:
http://myapp.com/#/new?param1=value¶m2=value2
在我的应用中,我有3-4个标签,每个标签都是自己的状态,可通过ui-sref="state"
问题在于,当我切换到这些状态中的任何一种时,我都会丢失用户最初输入的参数。
简而言之,当我切换状态时,我只想http://myapp.com/#/differentstate?param1=value¶m2=value2
而不是http://myapp.com/#/differentstate
。
我不确定如何设置...... 谢谢!
答案 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 } )" >