Angular 1 - 获取当前 URL 参数

IT技术 javascript angularjs ngroute
2021-03-01 00:30:34

我想从当前 URL 中提取数据并在控制器中使用它。例如我有这个网址:

app.dev/backend/surveys/2

我想提取的位:

app.dev/backend/ :type / :id

Angular 中有什么可以帮助我完成这项任务的吗?

6个回答

从 URL 获取参数ngRoute这意味着您需要在应用程序中包含angular-route.js作为依赖项。有关如何在官方ngRoute 文档中执行此操作的更多信息

问题的解决方案:

// You need to add 'ngRoute' as a dependency in your app
angular.module('ngApp', ['ngRoute'])
    .config(function ($routeProvider, $locationProvider) {
        // configure the routing rules here
        $routeProvider.when('/backend/:type/:id', {
            controller: 'PagesCtrl'
        });

        // enable HTML5mode to disable hashbang urls
        $locationProvider.html5Mode(true);
    })
    .controller('PagesCtrl', function ($routeParams) {
        console.log($routeParams.id, $routeParams.type);
    });

如果您不启用$locationProvider.html5Mode(true);. 网址将使用 hashbang( /#/)。

更多关于路由的信息可以在官方的 angular $route API 文档中找到


旁注:这个问题是回答如何使用 ng-Route 实现这一点,但是我建议使用ui-Router进行路由。它更灵活,提供更多功能,文档很棒,被认为是 angular 的最佳路由库。

是的,我在最后一句话中是说,您将拥有 hashbang 网址。
2021-04-26 00:30:34
我只是想知道为什么需要 $on('$routeChangeSuccess') 事件处理程序?我问是因为当我实现这个解决方案时(感谢你顺便发布它),我发现我的代码中必须有事件处理程序,否则它根本不起作用。更准确地说:它不会用参数的值填充我的 $scope 项目,但如果我将事件处理程序留在那里,它会这样做。我可以忍受,但最初希望在网站加载完成后获取参数。
2021-05-03 00:30:34
添加到迈克的评论中。如果您在 $rootScope.$on('$routeChangeSuccess', ...) 事件中添加 $routeParams 检查,那么它将为所有路由更改“存储”,并在每次路由更改时执行回调。如果您只想检查当前控制器的路由参数(即仅带有参数的路由),则只需将 $rootScope.$on(...) 全部删除并直接在控制器中自行检查 $routeParams功能。
2021-05-05 00:30:34
在没有 html5Mode 的情况下为我工作。但我的网址确实有/#/ -不过我对哈希网址很酷
2021-05-14 00:30:34

您可以注入$routeParams控制器并访问解析路由时使用的所有参数。

例如:

// route was: app.dev/backend/:type/:id

function MyCtrl($scope, $routeParams, $log) {
    // use the params
    $log.info($routeParams.type, $routeParams.id);
};

有关更多信息,请参阅angular $routeParams 文档

更好的是生成网址

app.dev/backend?type=surveys&id=2

然后使用

var type=$location.search().type;
var id=$location.search().id;

并在控制器中注入 $location。

这是迄今为止最好的答案。谢谢,兄弟!
2021-04-23 00:30:34

在您的路线配置中,您通常会定义一个路线,例如,

.when('somewhere/:param1/:param2')

然后,您可以通过使用$route.current.params 或 在控制器中获取解析对象中的路由$routeParams在任何一种情况下,参数都是使用路由的映射提取的,因此param1可以$routeParams.param1在控制器中访问

编辑:另请注意,映射必须准确

/some/folder/:param1

只会匹配一个参数。

/some/folder/:param1/:param2 

只会匹配两个参数。

这与大多数动态服务器端路由有点不同。例如 NodeJS (Express) 路由映射,您只能提供一个带有 X 个参数的路由。

所以目前我有这个:$routeProvider.when('/backend/:bookId/:chapterId/:weeep', { controller: 'SurveyPages' }); 但是当我将 $routeParams 传递给 SurveyPages 控制器并使用 console.log() 检查它是否显示我为空对象时?我猜我在这里做错了什么。
2021-04-27 00:30:34
html5Mode启用了吗?$locationProvider.html5Mode(true);
2021-05-12 00:30:34

例如:网址/:id

var sample= app.controller('sample', function ($scope, $routeParams) {
  $scope.init = function () {
    var qa_id = $routeParams.qa_id;
  }
});
通过对您在做什么以及为什么做的评论,这个答案会更加清晰。您还应该编辑它以正确格式化代码(选择代码并单击看起来像“{}”的按钮)。我自己没有这样做,因为我不确定代码是从第一行还是第二行开始。
2021-05-03 00:30:34