目标:
主要想法是获取$ location.path()而不使用在路由提供程序中设置的:param
。
描述:
假设我的应用程序必须使用一个参数定义随机路径。
因此,我将使用循环函数来定义所有这些以获得干净的代码和干燥问题。
例如:
// get pool of paths from server and set them dynamically
pathsApi.get().then(function(res){
// just example for demonstrate
res.data = ['search1','search2','search3','search4'];
angular.forEach(res.data, function(route,key){
.when('/search/' + route + '/:search', route.resolve('Search', '/', 'svm'));
});
});
// other regular paths
.when('/home', route.resolve('Home', '/', 'hvm'));
.when('/help', route.resolve('Help', '/', 'hlvm'));
GRAT。一切正常。现在我有很多可以访问的路径。
我需要的问题/建议:
我有一个做某些事情的指令。
其中一个是检查位置是否包含单词搜索,如果是,我想获取搜索路径的名称。
例如:
用户转到/#/search/search3/someText
我想获得/#/search/search3
。
当然我可以使用分割和其他技术。但我知道angular知道someText
是一个param(称为:search
)。
所以我确定angular可以告诉我什么是$ location。$ path没有:search
因此它将只是我之前提到过的路径。
我正在通过角度寻找优雅的方式而没有杂乱的代码,分裂或假设。 我不想使用$ location.search或$ location.hash。我想按原样保存URL方案。
答案 0 :(得分:0)
我找到了两种可能的快速解决方案,这取决于你是否喜欢它。
我使用了 angular-ui-router 。
第一个是创建routes.json文件,您可以在其中存储所有路由,然后在应用运行之前同步获取json并将所有路由存储在$ rootScope中,以便您可以在任何地方轻松访问它们。 使用此解决方案,您将始终将清晰路径存储在json中。
var routes;
$.ajax({
url : 'routes.json',
method : 'GET',
dataType : 'json',
async : false
}).success(function(response){
routes = response;
});
// Routes
var Settings = function($stateProvider, $urlRouterProvider){
$stateProvider
.state(routes.HOME.name, {
url : routes.HOME.path
})
.state(routes.SEARCH.name, {
url : routes.SEARCH.path + '/' + routes.SEARCH.params
});
$urlRouterProvider.otherwise('/');
};
Settings.$inject = [
'$stateProvider',
'$urlRouterProvider'
];
app.config(Settings);
<强> route.json 强>
{
"HOME" : { "name" : "home", "path" : "/" },
"SEARCH" : { "name" : "search", "path" : "/search", "params" : ":params" }
}
第二个,因为没有可以告诉你清晰路径的直接参数,你可以使用$ state.current.url告诉你当你在$中输入所有参数的当前网址stateProvider配置:like:param或:search
然后你可以使用$ stateParams知道你设置了哪些参数,并用字符串替换删除它。
也许可以帮到你
// Routes
var Settings = function($stateProvider, $urlRouterProvider){
$stateProvider
.state('home', {
url : '/',
template : 'home page'
})
.state('search', {
url : '/search/:param',
controller : 'SearchCtrl'
});
$urlRouterProvider.otherwise('/');
};
Settings.$inject = [
'$stateProvider',
'$urlRouterProvider'
];
app.config(Settings);
// Controller
var SearchCtrl = function($scope, $state, $stateParams){
// Parameters
var cleanPath;
// Methods
function initCtrl(){
cleanPath = getCleanUrlPath($state.current.url, $stateParams);
}
function getCleanUrlPath(url, params){
for( var param in params) {
// Remove from the url all params inside $stateParams
url = url.replace(':' + param, '');
}
return url;
}
// Initialize controller
initCtrl();
};
SearchCtrl.$inject = [
'$scope',
'$state',
'$stateParams'
];
app.controller('SearchCtrl', SearchCtrl);