2013-04-29 1 views
29

기본적으로 검색 결과가있는 테이블 인 응용 프로그램에서 각도를 사용하고 있습니다. 이 테이블에 액세스 http://myapp/?client=clientName

각도 컨트롤러가 행 세부 사항 (또한 부트 스트랩-UI와 각도 기반) 모달 대화 상자를 열기위한, 무엇보다도, 테이블에 대해 인스턴스화과 같은 URL을 통해 달성 될 수있다.

이러한 행 세부 정보는 두 컨트롤러에 대한 몇 가지 공통 기능이있는 서비스를 통해 가져옵니다. 하나는 테이블 용이고 다른 하나는 모달 용입니다.

지금,이 서비스 내에서, 나는 다음 코드를 검색 할 수 있습니다

service.fetchRelatedElements = function(element, cb) { 
    var url = '/search.json?results=20&type='+element.type; 
    if ($location.search()['client']) { 
    url += '&client=' + $location.search('client'); 
    } 
    return doFetch(url, cb); // actual server json GET 
}; 

목표는 테이블이 이미 필터로 설정이 특정 client 매개 변수가 있는지 알고있다.

이 호출의 시작 부분에 중단 점을 넣으면 $location.absUrl()이 현재 브라우저 URL (내 경우에는 내가 관심있는 client 매개 변수가 있음)을 반환한다는 것을 알 수 있습니다.

그러나 $location.search()은 빈 개체를 반환합니다.

서비스 내 $ 위치 서비스에 기본값 (즉, .config() 호출로 구성하지 않음)을 주입하고 있습니다. 문서로 그리고는 말한다 :

은 $ 위치 서비스합니다 (에서는 window.location에 기반) 브라우저의 주소 표시 줄에 URL을 구문 분석하고 응용 프로그램에 사용할 수있는 URL을합니다.

나는 뭔가가 부족합니까? 이 시점에서 URL을 파싱해야하지 않습니까?

감사합니다.


UPDATE : 나는 그것이 작동되도록 관리했습니다. 문제는 내가 모든 서비스에서 구성하지 않고 있다는 것입니다. 나는 그렇게 했으므로 디폴트를 취할 것이라고 생각했기 때문에 그렇게했다. 그러나 그것은 그것이 작동하는 방식이 아닌 것처럼 보인다.

+0

$ location.absUrl()의 출력을 공유 할 수 있습니까? 이것은 정규 표현식 문제와 같은 냄새를 풍깁니다. – Jmr

+0

예! 'http : // localhost : 3000/results? utf8 = % E2 % 9C % 93 & client = mond & type = & submittedLowerBound = & submittedUpperBound = & commit = Filter'입니다. 백엔드의 레일 앱입니다. – Pipetus

+4

솔루션에 대한 몇 가지 코드를 공유 할 수 있습니까? $ location.search()가 {}을 반환하는 동일한 문제가있는 임 – sthomps

답변

42

:

appModule.config(['$locationProvider', function($locationProvider) { 
     $locationProvider.html5Mode(true); 
    }]); 
+3

그런 식으로 앵글은 브라우저가 html5 모드를 지원하지 않는 경우 hashbang url로 대체됩니다. html5 모드가 아닌 쿼리 매개 변수를 얻는 방법과 각도에있는 라우터를 아는 방법은 무엇입니까? –

+0

예, HTML5 모드에서는 정상적으로 작동하지만 폴백은 여전히 ​​실패합니다. – Magne

+1

html5Mode로 설정하면 html 파일에도 기본 태그가 있어야합니다. –

3

$ location.search의 API는 꽤 혼란 스럽습니다.

$location.search('client'); 

은 검색 개체를 {client : true}로 설정하고 $ location을 반환합니다. 또한 'client' 대신 오타가 client이므로 빈 개체로 검색을 설정하고 있습니다. 그래서 당신은 아마 원하는 : 나는 내 응용 프로그램의 모듈 구성에 $locationProvider를 구성하기 전에 같은 문제 가졌다

url += '&client=' + $location.search()['client']; 
+0

감사합니다. Jmr, 오타가 수정되었습니다. 그러나 중요한 점은,'$ location.search()'는 단지'{}'를 반환한다는 것입니다. – Pipetus

+0

죄송합니다. 질문의 시작 부분에 중단 점을 두었습니다. $ location.search (클라이언트)가이를 무시하고있을 가능성이 있습니다. 이 경우에 무슨 일이 일어나는지 잘 모르겠다. $ location.search()는 내 컴퓨터에서 URL을 잘 파싱한다. – Jmr

3

을 당신은 $의에서는 window.location을 구문 분석 함수를 작성할 수 있습니다.나는이 문제가 발생하면이 댓글 https://github.com/angular/angular.js/issues/7239#issuecomment-42047533

function parseLocation(location) { 
    var pairs = location.substring(1).split("&"); 
    var obj = {}; 
    var pair; 
    var i; 

    for (i in pairs) { 
     if (pairs[i] === "") 
      continue; 

     pair = pairs[i].split("="); 
     obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 
    } 

    return obj; 
} 

$scope.query = parseLocation($window.location.search)['query']; 
5

기반으로 검색, 구성 설정 외에 나를 위해 일한 또 다른 한가지는 쿼리 문자열의 앞에 "#"을 추가하는 것입니다.

그래서 당신은
myapp/?client=clientName

myapp/#?client=clientName

허용 $의 location.search() 나에게 비어 있지 않은 객체를 제공하기 위해 당신이 할 수있는 다음 액세스를 변경 한 후, 쿼리 문자열을 생성 한 경우 각 매개 변수 사용 $location.search()['client']

+1

을 추가해야 할 수도 있습니다. 이 의견은 공식 문서에 있어야합니다. :) – under5hell

9

기본 태그를 지정하지 않으려면 require base false를 지정할 수 있습니다.

myapp.config(function($locationProvider) { 
    $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
    }); 
}); 
관련 문제