2013-12-18 5 views
35

Я хочу извлечь данные из текущего URL-адреса и использовать его в контроллере. Например, у меня есть этот URL:Угловой 1 - получить текущие параметры URL

app.dev/backend/surveys/2

Биты, которые я хочу, чтобы извлечь:

app.dev/backend/ : тип/: идентификатор

есть anyt в углу, что могло бы помочь мне с этой задачей?

+2

Посмотрите на '$ route' и' $ routeParam' –

+0

Я забыл сказать, что URL-адрес статичен и создан на стороне сервера. Не с угловым. Если это даже что-то изменит. – sarunast

+0

нет, неважно, как он был сгенерирован - пока вы не настроили его правильно в блоке '.config' приложения. –

ответ

53

Чтобы получить параметры из URL с ngRoute. Это означает, что вам необходимо включить angular-route.js в ваше приложение в качестве зависимости. Дополнительная информация, как это сделать на официальном ngRoute documentation.

Решение по вопросу:

// 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);. Urls будет использовать hashbang (/#/).

Дополнительную информацию о маршрутизации можно найти на официальном угловом $route API documentation.


Side Примечание: Этот вопрос отвечает, как достичь этого, используя нг-Route, однако я бы рекомендовал использовать ui-Router для маршрутизации. Он более гибкий, предлагает больше функциональности, документация отличная и считается лучшей библиотекой маршрутизации для угловых.

+0

Мне просто интересно, зачем нужен обработчик событий $ on ('$ routeChangeSuccess')? Я спрашиваю, потому что, когда я реализовал это решение (спасибо, что отправил его, кстати), я обнаружил, что я * должен * иметь обработчик событий в своем коде или просто не работает. Точнее: он не заполняет мои объекты $ scope значениями параметров, но это происходит, если я оставляю обработчик событий там. Я могу жить с ним, но изначально ожидал получить параметры после того, как веб-сайт закончил загрузку. –

+1

Чтобы добавить комментарий Майка. Если вы добавите проверку $ routeParams внутри события $ rootScope. $ On ('$ routeChangeSuccess', ...), тогда он будет «сохранен» для всех изменений маршрута и будет выполнять обратный вызов при каждом изменении маршрута. Если вы хотите только проверить параметры маршрута для текущего контроллера (т. Е. Только маршрут с параметрами), просто удалите $ rootScope. $ On (...) все вместе и проверьте $ routeParams сам по себе непосредственно в контроллере функция. –

+0

работал для меня без html5Mode. но у моих urls есть '/ # /' - im cool с хэш-адресами, хотя –

14

Вы можете ввести $routeParams вашему контроллеру и получить доступ ко всем параметрам, которые использовались при разрешении маршрута.

т.д .:

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

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

См angular $routeParams documentation для получения дополнительной информации.

3

В конфигурации маршрута вы обычно определяют маршрут, как,

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

Вы можете либо получить маршрут в объекте Resolve с помощью $route.current.params или в контроллере, $routeParams. В любом случае параметры извлекаются с использованием сопоставления маршрута, поэтому к param1 можно получить доступ к контроллеру $routeParams.param1.

Edit: отметить также, что отображение должно быть точным

/some/folder/:param1 

будет соответствовать только один параметр.

/some/folder/:param1/:param2 

будет соответствовать только два параметра.

Это немного отличается от большинства динамических маршрутов на стороне сервера. Например, сопоставление маршрутов NodeJS (Express), где вы можете предоставить только один маршрут с X числом параметров.

+0

Так в настоящее время у меня есть это: '$ routeProvider.when ('/ бэкенд /: BookID /: chapterId /: weeep', { \t контроллер: '' SurveyPages });' Но когда я передать $ routeParams к контроллеру SurveyPages и использовать console.log(), чтобы проверить, показывает ли он пустой объект? Я предполагаю, что я делаю что-то неправильно здесь. – sarunast

+1

Включен ли 'html5Mode'? '$ locationProvider.html5Mode (true);' – Mouagip

2

например: URL /: идентификатор

var sample= app.controller('sample', function ($scope, $routeParams) { 
    $scope.init = function() { 
    var qa_id = $routeParams.qa_id; 
    } 
}); 
+4

Этот ответ был бы более ясным с комментарием о том, что вы делаете и почему. Вы также должны отредактировать его для правильного форматирования кода (выберите код и нажмите кнопку, которая выглядит как «{}»). Я не делал этого сам, так как не уверен, начинается ли код на первой или второй строке. – DavidW

4

Лучше бы генерировать URL, как

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

, а затем использовать

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

и впрыснуть $ расположение контроллера.

+0

Это лучший ответ. Спасибо дружище! –