AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까?
AngularJS를 사용하여 URL 쿼리 매개 변수의 값을 읽고 싶습니다. 다음 URL을 사용하여 HTML에 액세스하고 있습니다.
http://127.0.0.1:8080/test.html?target=bob
예상대로 location.search
입니다 "?target=bob"
. target 값에 액세스하기 위해 웹에 나열된 다양한 예제를 찾았지만 AngularJS 1.0.0rc10에서는 작동하지 않습니다. 특히 다음은 모두입니다 undefined
.
$location.search.target
$location.search['target']
$location.search()['target']
누가 효과가 있는지 아는 사람 있습니까? ( $location
내 컨트롤러에 매개 변수로 사용 하고 있습니다)
최신 정보:
아래에 솔루션을 게시했지만 완전히 만족하지는 않습니다. 에서 문서 개발자 가이드 : 각도 서비스 : $ 위치를 사용하여이 에 대한 다음 상태 $location
:
언제 $ location을 사용해야합니까?
응용 프로그램이 현재 URL의 변경에 반응하거나 브라우저에서 현재 URL을 변경하려는 경우 언제든지.
내 시나리오의 경우 내 페이지가 쿼리 매개 변수를 사용하여 외부 웹 페이지에서 열리므로 "현재 URL의 변경에 반응하지 않습니다". 어쩌면 $location
작업에 적합한 도구가 아닐 수도 있습니다 (추악한 세부 사항은 아래 답변을 참조하십시오). 따라서이 질문의 제목을 "$ location을 사용하여 AngularJS에서 쿼리 매개 변수를 읽는 방법"에서 변경했습니다. "AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까?" 분명히 자바 스크립트와 정규 표현식을 사용하여 구문 분석 할 수 location.search
는 있지만 저수준으로 이동하면 프로그래머의 감수성을 실제로 손상시킵니다.
그래서 : $location
내 대답보다 더 나은 방법이 있습니까? 아니면 간결한 대안이 있습니까?
당신은 삽입 할 수 $ routeParams을 (필요 ngRoute을 컨트롤러로). 다음은 문서의 예입니다.
// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
편집 : $ location 서비스 ( ng
) 에서 쿼리 매개 변수를 가져오고 설정할 수 있습니다 . 특히 $ location.search ()search
메소드 입니다.
$ routeParams는 컨트롤러의 초기로드 후 유용성이 떨어집니다. $location.search()
언제든지 호출 할 수 있습니다.
html5 모드로 작업하는 것이 좋지만 hashbang 모드에서 작동하도록 할 수도 있습니다.
간단하게 사용할 수 있습니다 :
$location.search().target
'타겟'검색 매개 변수에 액세스합니다.
참고로, 작동하는 jsFiddle은 다음과 같습니다. http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
var myApp = angular.module('myApp', []);
function MyCtrl($scope, $location) {
$scope.location = $location;
$scope.$watch('location.search()', function() {
$scope.target = ($location.search()).target;
}, true);
$scope.changeTarget = function(name) {
$location.search('target', name);
}
}
<div ng-controller="MyCtrl">
<a href="#!/test/?target=Bob">Bob</a>
<a href="#!/test/?target=Paul">Paul</a>
<hr/>
URL 'target' param getter: {{target}}<br>
Full url: {{location.absUrl()}}
<hr/>
<button ng-click="changeTarget('Pawel')">target=Pawel</button>
</div>
내 자신의 질문에 부분 답변을 제공하기 위해 HTML5 브라우저에 대한 실제 샘플은 다음과 같습니다.
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
<script>
angular.module('myApp', [], function($locationProvider) {
$locationProvider.html5Mode(true);
});
function QueryCntl($scope, $location) {
$scope.target = $location.search()['target'];
}
</script>
</head>
<body ng-controller="QueryCntl">
Target: {{target}}<br/>
</body>
</html>
열쇠는 $locationProvider.html5Mode(true);
위와 같이 전화 하는 것이 었습니다 . 이제 열 때 작동합니다 http://127.0.0.1:8080/test.html?target=bob
. 구형 브라우저에서는 작동하지 않는다는 사실에 만족하지 않지만 어쨌든이 방법을 사용할 수 있습니다.
구형 브라우저에서 작동하는 대안은 html5mode(true)
전화를 끊고 대신 해시 + 슬래시와 함께 다음 주소를 사용하는 것입니다.
http://127.0.0.1:8080/test.html#/?target=bob
관련 문서는 개발자 안내서 : Angular Services : $ location 사용 (Google 검색에서 찾지 못한 이상한 것입니다.)에 있습니다.
두 가지 방법으로 수행 할 수 있습니다.
- 사용
$routeParams
최상의 권장 솔루션은 $routeParams
컨트롤러 에 사용 하는 것입니다. 그것은 필요 ngRoute
설치할 모듈을.
function MyController($scope, $routeParams) {
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
// $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
var search = $routeParams.search;
}
- 사용
$location.search()
.
여기에 경고가 있습니다. HTML5 모드에서만 작동합니다. 기본적으로 해시 ( #
) 가없는 URL에는 작동하지 않습니다http://localhost/test?param1=abc¶m2=def
#/
URL 을 추가하여 작동시킬 수 있습니다 .http://localhost/test#/?param1=abc¶m2=def
$location.search()
다음과 같은 객체를 반환하려면
{
param1: 'abc',
param2: 'def'
}
$ location.search ()는 HTML5 모드가 켜져 있고 지원되는 브라우저에서만 작동합니다.
이것은 항상 작동합니다 :
$ window.location.search
그냥 여름에.
앱이 외부 링크에서로드되는 경우 angular는 이것을 URL 변경으로 감지하지 않으므로 $ loaction.search ()가 빈 객체를 제공합니다. 이 문제를 해결하려면 앱 구성에서 다음을 설정해야합니다 (app.js)
.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider)
{
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.otherwise({
redirectTo: '/'
});
$locationProvider.html5Mode(true);
}]);
엘리스 화이트 헤드의 정답입니다. 태그가 $locationProvider.html5Mode(true);
있는 애플리케이션의 기본 URL을 지정 <base href="">
하거나 매개 변수 requireBase
를로 설정 하지 않으면 새 버전의 angularjs에서 작동하지 않습니다.false
문서에서 :
html5Mode (history.pushState)를 사용하도록 $ location을 구성하는 경우 태그가있는 응용 프로그램의 기본 URL을 지정하거나 requireBase : false가있는 정의 객체를 $ locationProvider에 전달하여 $ locationProvider가 기본 태그를 요구하지 않도록 구성해야합니다. html5Mode () :
$locationProvider.html5Mode({
enabled: true,
requireBase: false
});
$ location. $$ search.yourparameter를 사용할 수도 있습니다
이것은 당신을 도울 수 있습니다
AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까
// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
<script>
angular.module('myApp', [], function($locationProvider) {
$locationProvider.html5Mode(true);
});
function QueryCntl($scope, $location) {
$scope.target = $location.search()['target'];
}
</script>
</head>
<body ng-controller="QueryCntl">
Target: {{target}}<br/>
</body>
</html>
($location.search()).target
SPA HTML5Mode의 경우 많은 404 오류 문제가 발생하며이 경우 $ location.search를 작동시킬 필요가 없습니다. 필자의 경우 사용자가 처음에 연결하는 "페이지"에 관계없이 사용자가 내 사이트를 방문 할 때 URL 쿼리 문자열 매개 변수를 캡처하고 로그인하면 해당 페이지로 보낼 수 있습니다. app.run에있는 것들
$rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) {
if (fromState.name === "") {
e.preventDefault();
$rootScope.initialPage = toState.name;
$rootScope.initialParams = toParams;
return;
}
if ($location.search().hasOwnProperty('role')) {
$rootScope.roleParameter = $location.search()['role'];
}
...
}
나중에 로그인 후 $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)라고 말할 수 있습니다.
조금 늦었지만 문제가 URL이라고 생각합니다. 대신에
http://127.0.0.1:8080/test.html?target=bob
너는
http://127.0.0.1:8080/test.html#/?target=bob
나는 그것이 효과가 있었을 것이라고 확신한다. Angular는 실제로 # /에 대해 까다 롭습니다.
'Programing' 카테고리의 다른 글
Subversion 저장소에서 마지막 n 개정을 git-svn 복제하는 방법은 무엇입니까? (0) | 2020.03.11 |
---|---|
JDBC를 사용한 연결 풀링 옵션 : DBCP vs C3P0 (0) | 2020.03.11 |
루비에서 열거 형을 구현하는 방법은 무엇입니까? (0) | 2020.03.11 |
자바 스크립트 약속-거부와 던지기 (0) | 2020.03.11 |
GDI +, JPEG 이미지에서 MemoryStream으로 일반 오류가 발생했습니다. (0) | 2020.03.11 |