2011-12-07 3 views
8

Backbone.js를 사용하면 라우터를 원래의 페이지로 이동할 수 있습니까? 팝업이 나타나면 내 URL을 변경하는 경우에이를 사용하고 싶습니다. 팝업을 숨기면 다시 변경해야합니다. 뒤로 가기를 원하지 않습니다. 배경 페이지를 팝업을 나타 내기 전에 왼쪽과 정확히 같은 위치에 유지하고 싶습니다.Backbone.js를 사용하여 url을 이전 버전으로 자동 변경합니다.

답변

14

당신은 Backbone.Router을 확장하고 탐색 중 모든 경로를 저장하여이 문제를 해결할 수 있습니다. 당신이 당신의 모달을 기각해야 할 때

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
    @on "all", @storeRoute 
    @history = [] 
    super options 

    storeRoute: -> 
    @history.push Backbone.history.fragment 

    previous: -> 
    if @history.length > 1 
     @navigate @history[@history.length-2], true 

그런 다음, 단순히 다시 마지막으로 "해시"로 리디렉션됩니다 MyRouter.previous() 메서드를 호출합니다.

+3

실제로 구멍 기록 대신 마지막 "해시"만 저장할 수도 있습니다 – mateusmaso

+0

감사합니다! 정확히 내가 무엇을 찾고 있었는지. – Felipe

+0

이것을 사용하면 storeRoute 메서드가 항상 사용할 라우팅 메서드보다 먼저 호출됩니다. 결과적으로 히스토리에 저장된 내용은 일관성이 없습니다. – DrewB

-2

팝업 또는 오버레이의 onCloseEvent에서 경로를 트리거 할 수 있습니다. :

router.navigate('/lasturl/'); 

이렇게하면 URL이 설정됩니다. 두 번째 매개 변수로 true를 전달하면 경로 작업도 실행됩니다. 그렇지 않으면 페이지가 변경되지 않습니다.

http://documentcloud.github.com/backbone/#Router-navigate

+8

물론 마지막 질문은 내가 어떻게 알 수 있습니까? 백본이 유용한 방법을 제공합니까, 아니면 window.history에서 가져와야합니까? – user802232

1

나는 mateusmaso의 답변이 대부분 맞다고 생각하지만, 당신이 찾고있는 올바른 URL을 항상 얻을 수 있도록 약간의 수정이 필요하다고 생각합니다.

먼저 당신은 beforeRoute 방법 화재가 할 수있는 경로 메소드를 오버라이드 (override) 할 필요가 : 그럼

route: (route, name, callback) => 
    Backbone.Router.prototype.route.call(this, route, name, => 
    @trigger('beforeRoute') 
    callback.apply(this, arguments) 
    ) 

당신은 이벤트를 바인딩하고 역사 인스턴스 변수 초기화 :

initialize: (options) ->  
    @history = [] 
    @on "beforeRoute", @storeRoute 

다음 생성 헬퍼 메소드를 조각 저장 및 검색 :

storeRoute: => 
    @history.push Backbone.history.fragment 

previousFragment: => 
    @history[@history.length-2] 

마지막으로, 다시로드하지 않고 URL을 변경하고 결과 조각을 저장하는 데 사용할 수있는 최종 도우미 메서드가 필요합니다. 팝업을 닫을 때이 옵션을 사용해야합니다. 그렇지 않으면 사용자가 다른 곳을 탐색하지 않고 팝업을 다시 가져 오면 예상되는 조각이 사용자의 기록에 남지 않습니다. 이는 "trigger : true"없이 navigate를 호출하면 이벤트 핸들러가 조각을 저장하도록 트리거하지 않기 때문입니다.

changeAndStoreFragment: (fragment) => 
    @navigate(fragment) 
    @storeRoute() 
0

이 답변은 질문에 답할 수 없지만 많은 문제가 있습니다. 후행 슬래시 때문에 이전 경로 또는 맞춤 경로로 자동으로 탐색 할 수 없습니다. 경로 기능을 실행하지 않으려면 {trigger:false}을 사용하거나 false이 기본 동작이므로 트리거를 전혀 사용하지 말고 경로가 '#/something'(슬래시에주의) 대신 #something으로 시작하는지 확인하십시오. 라우터 부분 인 Backbone.js 내의 regEx를 변경하십시오.

관련 문제