2013-07-18 2 views
7

백본의 navigate 속성을 사용하려고합니다.백본이 Firefox에서 두 번 트리거합니다.

this.navigate("week/" + companyName + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 

위의 코드는 한 번 실행됩니다.

routes: { 
    "week/:companyName/:employeeNo/:weekEnd": "getWeek" 
}, 

를 그리고이 함수는 두 번 당한다 :

그것은이 명중

getWeek: function (companyName, employeeNo, weekEnd) { 
    console.log('getWeek:', companyName, employeeNo, weekEnd); 
} 

이 그것은 IE와 크롬에 한 번, 파이어 폭스에 두 번 기록됩니다.

무엇이 문제입니까? 나는 원래 트리거를 true로 설정하지 않았고 Firefox는이를 무시하고 여전히 URL을 트리거했습니다.

+0

초기화되지 않은 백본 소스를 사용하여 코드를 단계별로 실행해야합니다. 특히 'loadUrl'이 호출 될시기와 콜백을 실행하는 내용을 찾아야합니다. – Andrew

+0

Firefox와 Mac의 Chrome + Safari에서 Backbone.js 탐색 트리거가 다르게 나타났습니다. – prototype

답변

6

Firefox에서 Backbone.navigate 후에 두 개의 서버 호출을 수행하는 것과 비슷한 문제가있었습니다. 제 경우에는 문자열을 인코딩하지 않았기 때문입니다. 회사 이름에 인코딩해야하는 문자가 있습니까?

당신은 시도 할 수 : 저도 같은 문제로 실행하고 여기에 근본적인 문제에있어 같은

this.navigate("week/" + escape(companyName) + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 
+1

이전에도이 문제가 발생했으며 수정 사항은 인코딩과 관련이 있습니다. –

+0

발음 구별 부호와 동일한 문제가 발생합니다. http://jsfiddle.net/adyz/qcged76e/2/ 그 점에 대해 어떻게 생각하십니까? @AdamLockhart? –

4

가에서 스테핑.

앞서 언급 한 모두가 문제는 URL 인코딩에서 비롯된 것입니다. 이제 Firefox에서만 문제가 나타나는 이유 ...

해시가 변경 될 때 경로가 어떻게 호출되는지 빠르게 요약 해 보겠습니다.

  • loadUrl : 여기에 3 개 주요 기능이 있습니다이 기능은 경로 핸들러를 호출 할 것입니다.
  • 이동이 직접 경로를 변경하기 위해 사용되는 함수이다. 트리거 플래그가 사실로 설정되어있는 경우,이 함수는 loadUrl를 호출합니다.
  • checkUrl : (그것은 물론 가능한 경우)이 기능이 개체에 onhashchange 이벤트에 대한 콜백으로 설정됩니다. 특정 조건에 따라 loadUrl도 실행됩니다.

지금, 우리는 흥미로운 부분에 있어요.

을 실행하면으로 이동하면 백본은 탐색 한 조각을 캐시합니다. 해시 변경, checkUrl도 호출됩니다. 캐시 해시가 현재와 동일한 경우는 탐색 전에라는 경우는 이미 호출 된 것을 의미하기 때문에, loadUrl을 실행하지 않도록이 기능은 다음, 확인합니다.비교를 위해 checkUrlgetFragment 인 현재 해시를 가져오고 getHash을 사용합니다. 여기 getHash의 코드입니다 :

getHash: function(window) { 
    var match = (window || this).location.href.match(/#(.*)$/); 
    return match ? match[1] : ''; 
}, 

그리고 당신은 당신의 문제가있어. location.href은 firefox에서는 URI로 인코딩되지만 Chrome에는 없습니다. 따라서 다른 해시 ( 또는 트리거 플래그가 있거나 없음)로 이동하면 firefox에서 Backbone은 해독되지 않은 버전의 해시를 캐시 한 다음 인코딩 된 버전과 비교합니다. 해시에 인코딩해야하는 문자가 포함 된 경우 비교 결과는 음수가되고 Backbone은 실행해서는 안되는 경로 처리기를 실행합니다.

해결책에 따르면, 사람들은 이전에 말했듯이 URI를 인코딩해야합니다.

+0

안녕하세요 @Loamhoof, 나도 비슷한 문제가 있지만 Mac의 Safari에서는 이번이 있습니다. 여기에서 문제를 찾을 수 있습니다 : http://jsfiddle.net/adyz/qcged76e/2/ - 기본적으로 발음 구분으로 인해 생각합니다. - 인코딩되었거나 안된다. 두 번째 링크를 클릭하면 url이 route 함수에 의해 디코딩됩니다. 고마워요 톤 –

+0

너무 사파리에있어. –

+1

안녕하세요 @AdrianFlorescu. Backbone의 코드를 보면서 무엇이 잘못되었는지, 특히 문제의 열쇠를 가지고있는 앞서 언급 한'checkUrl' 함수를 보길 권한다. 이 응답은 얼마 전 작성되었습니다 (백본 1.0). 그러나 백본 코드의이 부분은 그 이후로 많이 변경되지 않은 것 같습니다 : http://backbonejs.org/docs/backbone.html#section-232. 행운을 빈다. 문제를 해결하면 결과를 게시하십시오.) – Loamhoof

관련 문제