获取没有参数

时间:2015-09-07 10:59:33

标签: angularjs routes

目标
主要想法是获取$ 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方案。

1 个答案:

答案 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);