2013-05-02 6 views
8
내가 문제가있는 흐름을 통해 살펴 보겠습니다

...뒤로 버튼을 깨지 않고 Angular의 html5Mode = true를 사용하여 페이지 새로 고침을 트리거하는 링크를 어떻게 섞으면됩니까?

  • 나는로드 google.com 내가 고토 app.com
  • 내가 에 탐색
  • (단지 출발점으로) I는 NAV
  • app.com/projects에 app.com/api/test
  • I (에서는 window.location 통해) 원시 JSON을 참조하십시오 (좋은 지금까지 ...)
  • 내가 다시 누르면, URL은 app.com/projects으로 바뀌지 만 여전히 JSON이 표시됩니다.
  • 다시 누르면 URL이 app.com으로 변경되지만 여전히 JSON이 표시됩니다.
  • 다시 입력하면 google.com가 다시로드됩니다.을 원하는대로 html5Mode = true이 Webkit- 에서 파이어 폭스가 작동하는 경우에만 나는 앞으로 눌러
  • , app.com 부하는 잘 ... 정상
  • 이상한 무엇

다시 모든이며, 나는이 관찰했습니다 ..

. . .

첫째, 내 server.coffee은 다음과 같습니다

app.get '/partials/:partial', routes.partials 
app.get '/api/test', api.test 
app.get '*', routes.index 

는 기본적으로 모든 요청이 인덱스를로드 뷰/부분 처리기에 대한 예외 및 테스트 API를 경로로 (이 부트 스트랩 각도) 원시 JSON으로 응답합니다.

. . .

, 내 app.coffee은 다음과 같습니다,

두 번째 (I 중첩 전망과 UI가 상태를 관리하기위한 ui-router 모듈을 사용하고이 각도의 $routeProvider과 매우 유사하다, $urlRouterProvider 사용) :

app = angular.module('app', ['ui-router']) 
.config([ 
    '$stateProvider' 
    '$locationProvider' 
    '$urlRouterProvider' 
    ($stateProvider, $locationProvider, $urlRouterProvider)-> 
     $urlRouterProvider 
      .when('/api/test', [ 
       '$window' 
       '$location' 
       ($window, $location)-> 
        $window.location.href = '/api/test' 
      ]) 
      .otherwise('/') 
     $stateProvider 
      .state 'home', 
       url: '/' 
       templateUrl: 'partials/index' 
       controller: 'IndexCtrl' 
      .state 'projects', 
       url: '/projects' 
       templateUrl: 'partials/projects' 
       controller: 'ProjectsCtrl' 
     $locationProvider.html5Mode(true).hashPrefix '!' 
]) 

모든 것이 비동기이므로 window.location.href에 액세스하여 서버가 경로를 처리 할 수 ​​있도록 페이지 새로 고침을 트리거해야합니다.

제 질문은 뒤로 버튼을 깨지 않고 각도의 html5Mode으로 페이지 새로 고침을 트리거하는 링크를 섞어도됩니까? 이것은 Webkit 버그 일 뿐이며, 더 좋은 방법이 있습니까?

이상적으로는 응용 프로그램을 Angular에서 실행해야하지만, "about"또는 "contact"페이지 (동적 또는 비동기 일 필요는 없음)와 같은 것들은 일반 페이지를 사용하여 서버에서 직접 제공됩니다 새로 고침 ...

Help!

+1

지금 내가 대답을 가지고, 내가 중복 질문을 발견 http://stackoverflow.com/questions/11580004/angular-js-link-behaviour-disable-deep-linking-for-specific-urls – jlmakes

답변

18

두 가지 옵션 :

  1. 당신이 <a /> 태그를 사용하는 경우, AngularJS와 그것이 자신의 클릭 (해당 링크는 일반적으로 브라우저에 의해 처리됩니다) 캡처 안 알려 target="_self"를 지정합니다. 이것은 해킹이 아닙니다. 이는 정상적으로 문서화 된 동작입니다.
  2. 이전처럼 $window.location = 'foo'을 사용하십시오. 그것은 받아 들일 수 있습니다.
+4

옵션 1에 +1,'html5Mode = true'로 웹킷의 뒤로 버튼을 수정합니다; 나는 문서에서 그것을 확실히 놓쳤다, 감사합니다 Ezekiel! – jlmakes

+0

빅터의 솔루션이 작동합니다. target="_self"을 설정하면 라우팅보다 페이지를 다시로드해야합니다. –

+0

감사! 너는 내 목숨을 구하는거야! –