2017-01-04 12 views
0

KnockoutJS SPA tutorial의 예제에서 영감을 얻어 Sammy.js을 사용하여 단일 페이지 응용 프로그램에서 간단한 동작을 연결하고 URL 해시를 사용하여 호출되는 API 끝점을 추적합니다. 나는이처럼 보이는 페이지의 역사와 끝까지하려고 해요 : 모든 경우에SammyJS가 일반 해시와 동일한 슬래시를 포함하는 해시를 처리하지 않는 이유는 무엇입니까?

의 URL 조각은 실제로 API 호출을하는 데 사용 된 원시 URL입니다. 현재 페이지를 렌더링 한

문제는 위치 해시에 슬래시 문자가 포함되어 있으면 Sammy의 경로 처리가 제대로 작동하지 않을 수 있으며 이유가 무엇인지 알 수 없습니다. RFC3986에 따르면 "문자 슬래시 ("/ ")와 물음표 ("? ")는 조각 식별자 내의 데이터를 나타낼 수 있으므로"이스케이프 처리되지 않은 슬래시와 물음표를 사용할 수 있어야합니다. URL 조각의 문자.

다음은 여러 가지 시나리오를 다루는 완전한 재현 사례입니다. 두 가지 Sammy 경로가 정의되어 있습니다. 구문에 대한 내 이해가 정확하면 해시를 포함하는 항목을 캡처하고 다른 하나는 빈 경로와 일치해야합니다. 그래도 그런 일은 일어나지 않습니다.

<!DOCTYPE html> 
<html> 
<head> 
    <title>SammyJS routing demo</title> 
    <script type="text/javascript" src="Scripts/jquery-3.1.1.min.js"></script> 
    <script type="text/javascript" src="Scripts/sammy-0.7.5.min.js"></script> 
</head> 
<body> 
    <ul> 
     <li><a href="#foo">#foo</a> - prints 'foo'</li> 
     <li><a href="#/bar">#/bar</a> - prints 'NOPE'</li> 
     <li><a href="#!/baz">#!/baz</a> - prints 'NOPE'</li> 
     <li><a href="#foo/bar">#foo/bar</a> - prints 'NOPE'</li> 
     <li><a href="#foo/bar#bop">#foo/bar#bop</a> - prints 'bop'</li> 
     <li><a href="#why?not">#why?not</a> - prints 'why'</li> 
     <li><a href="#why?not#zoidberg">#why?not#zoidberg</a> - prints 'why?not#zoidberg'</li> 
     <li><a href="#why?not#zoidberg/">#why?not#zoidberg/</a> - prints 'NOPE'</li> 
    </ul> 
    <script type="text/javascript"> 
     Sammy(function() { 
      this.get('#:url', function() { console.log(this.params.url); }); 
      this.get('', function() { console.log('NOPE'); }); 
     }).run(); 
    </script> 
</body> 
</html> 

새미가 이러한 조각을 일관성있게 처리하려면 어떤 아이디어가 필요합니까?

답변

2

따라서 Sammy.js는 http://sammyjs.org/docs/routes에 나와 있습니다. "/ '가 포함 된 문자열과 일치 시키려면 작동하지 않습니다. 원한다면 Regexp와'splat '"을 사용할 수 있으며, 실패합니다.

그러나 첫 번째 this.getthis.get('#(.*)', function() { console.log(this.params['splat']); });으로 바꾼다면 "#why? not"는 빠져 나오지 만, 아마도 쿼리 문자열과 "#why? not # zoidberg "행복하지는 않지만 URL에 #을 사용해야한다고 말하고 싶습니다.)

https://jsfiddle.net/gymt828r/은 고정 인스턴스를 보여줍니다.

1

URL 내의 Sammy params에는 슬래시 문자를 사용할 수 없습니다. 그럴 경우 "#/path/: var1/other/: var2"와 같은 URL을 사용할 수 없습니다.

this.get(/\#(.*)/, function() { 
    console.log(this.params['splat']); 
}); 

위 출력됩니다에게 URL을 다음 경로의 각각에 대해 : 대신 (추가 정보를 원하시면 http://sammyjs.org/docs/routes 참조) 아래의 예와 같이, 당신의 경로와 일치 할 때마다 정규식을 사용하는 것이 좋습니다

불행히도 "?"다음 항목을 가져올 수 없습니다. 하지만 이것을 사용하는 캐릭터. 이것들은 "this.params"에 따로 따로 구문 분석됩니다.

불행하게도, 당신은 여러 해시를 할 수 없습니다 : 그래서 다음 URL은 "this.params.page는"적절한 값으로 설정 한 것 URL 및 Sammy는 해시의 마지막 인스턴스부터 시작하여 URL의 일부만 살펴보고 "#why? not # zoidberg"가 작동하는 이유를 설명합니다.