Angularjs 获取不带参数的URL路径

Angularjs 获取不带参数的URL路径,angularjs,routes,Angularjs,Routes,目标: 其主要思想是获取$location.path(),而不使用路由提供程序中设置的:param 说明: 假设我的应用程序必须使用一个参数随机定义路径。 所以,我将使用循环函数来定义所有这些函数,以实现干净的代码和干涸的问题 例如: // get pool of paths from server and set them dynamically pathsApi.get().then(function(res){ // just example for demonstrate r

目标
其主要思想是获取$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'));
格拉特。一切正常。现在我有很多路径可以访问

我需要的问题/建议
我有一个做一些事情的指令。 其中之一是检查位置是否包含单词search,如果是,我想获取搜索路线的名称

例如:

// 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'));
用户进入
/#/search/search3/someText

我想获得
/#/search/search3

当然,我可以使用拆分和其他技术。但我知道angular知道
someText
是一个参数(称为
:search
)。 因此,我确信angular可以告诉我$location.$path是什么,没有
:search
,因此它将只是我前面提到的路径

我正在寻找一种优雅的方式,通过angular无混乱的代码,分裂或假设。
我不想改用$location.search或$location.hash。我想按原样保存URL方案。

我找到了两种可能的快速解决方案,这取决于您是否喜欢

我使用了角度ui路由器

第一个是创建一个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配置中键入的所有参数的当前url: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);


我找到了两种可能的快速解决方案,这取决于你是否喜欢

我使用了角度ui路由器

第一个是创建一个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配置中键入的所有参数的当前url: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);


如果你切换到比NgRoute健壮得多的angular ui路由器,问题就变得无关紧要了。如果你切换到比NgRoute健壮得多的angular ui路由器,问题就变得无关紧要了。在这样的url情况下有点问题:
help/programs/help+me+to+understand
Replace在单词为
help
的情况下不会像预期的那样工作,并且在某些情况下可能有点问题。Replace只对状态中写入的参数有效,而不会对查询字符串本身有效。例如,如果设置“search/:param”,则替换将不处理URL中插入的字符串,而是处理“:param”。我使用的是内置的
ngRoute
angular库。您的答案基于
angular ui router
?是的,它写在第二行。我在回答后加了一句:)我考虑过你的想法。在这样的url情况下有点问题:
help/programs/help+me+to+understand
Replace在单词为
help
的情况下不会像预期的那样工作,并且在某些情况下可能有点问题。Replace只对状态中写入的参数有效,而不会对查询字符串本身有效。例如,如果设置“search/:param”,则替换将不处理URL中插入的字符串,而是处理“:param”。我使用的是内置的
ngRoute
angular库。您的答案基于
angular ui router
?是的,它写在第二行。我在回答之后加了一句:)