나는 여기에서 상황을 파악할 수없는 것 같습니다. 이 문제를 해결하는 방법을 알고있는 사람이 있다면 추천을 듣고 싶습니다. 감사합니다.백본 (1.0.0)에서 쿼리 문자열 사용
앱의 하위 탐색 바에 표시되는 '전체보기'가 있는데이 캘린더는 전역 캘린더 역할을합니다. 응용 프로그램, 거의 모든보기는 달력보기 & 모델을 사용하여 선택한 날짜에 따라 데이터를 표시하도록 설정합니다.
같은이 달력보기/모델은 역사에 날짜가 변경 될 때마다 시간을 저장 할 수있는 방법이 있어야합니다,이 (내가 생각하는) 하나의 URL 또는 쿼리 문자열 매개 변수를 날짜가 변경 될 때마다 사용하여 수행됩니다, 뭔가
webapp/view1?date=20120301
날짜가 변경되면 검색어 문자열도 변경됩니다.
각 경로에 (/ : date) 선택적 매개 변수를 지정할 필요가 없도록 쿼리 문자열 매개 변수를 사용하고 싶습니다.
THING IS 백본은 쿼리 문자열이 변경 될 때 경로 변경 또는 기록 이벤트를 중지했지만 Backbone.History 구현에서 쿼리 문자열을 무시하기 만하면 매번 추적 할 수없는 모든 구현 원인이 깨집니다. 쿼리 문자열이 변경되어 "뒤로"버튼이 변경 이벤트를 발생시키지 않으므로 캘린더의 날짜를 변경하는 모델의 날짜를 변경할 수 없습니다.
"pretty URL"을 사용하고 각보기에 날짜 매개 변수를 추가하는 간단한 해결책이 있지만이를 피하려고합니다.
제안 사항? 사전에 감사
나는 또한 URL 변화와 역사를 추적하는 나에게 많은 문제를 가져올 것입니다 쿼리 문자열을 사용하여 원인, 문서에서 알 수 백본처럼 "꽤 URL을"사용하여 종료
UPDATE pushState 대신 hashchange를 사용할 때 예상대로 작동하지 않습니다. 라우터의 "경로"이벤트에, 라우터, 뷰, 컨트롤러, 뭔가 어딘가에 부착
날짜에 대한 URI를 확인하고이 날짜를 설정하려면 :
그래서, 내 코드는 다음과 결국
checkURIdateParameter: function (route, arr) {
var found = false;
for (var i = 0; i < arr.length ; i++) {
if (arr && arr[i] && arr[i].indexOf("date=") != -1) {
if (app.models.dateControl) {
var dateFromParameter = new Date(arr[i].substring("date=".length).replace(/\$/g, ":"));
dateFromParameter = (isNaN(dateFromParameter.getTime())) ? app.models.dateControl.defaults.date : dateFromParameter;
app.models.dateControl.set("date", dateFromParameter);
found = true;
}
}
}
if (!found) app.models.dateControl.set("date", app.models.dateControl.defaults.date, {changeURI:false});
}
이것은 URI에서 PARAMS을 읽고 REFL 할 기능의 역할 :
this.listenTo(myRouter, "route", this.routeChanged);
그런 다음,이 방법은 같은 것을 할 것 : 달력 선택기로 dateControl에서 변경 내용을 처리하십시오.
날짜가 변경 될 때마다 URI를 새로운 것으로 업데이트하여 (매개 변수가 뷰와 동기화되도록) 다른 방법이 있어야하며 링크를 복사하여 붙여 넣을 수 있습니다 아무 문제 없어.라우터, 뷰 컨트롤러
어딘가에 :
this.listenTo(app.models.dateControl, "change:date", this.updateURIdateParameter);
이는이 모델이 일정 선택기 (UI 제어부) 또는 업데이트하고, 현재의 날짜가 모델에 부착되는 방법 라우트 이벤트 (routeChanged, 위보기)와 링크 된 메소드.
이 메서드는이 같은 일을 수행해야합니다
, updateURIdateParameter: function (a, b, c) {
if (c && c.changeURI == false) return; //this is in case i don't want to refresh the URI case the default date is set.
var currentFragment = Backbone.history.fragment;
var newFragment = "";
var dateEncoded = app.models.dateControl.get("date").toJSON().replace(/\:/g, "$");
newFragment = currentFragment.replace(/\/date=([^/]+)/, "") + "/date=" + dateEncoded;
if (newFragment != currentFragment) {
app.router.navigate(newFragment, false);
}
}
이 방법은 해당 모델에서 선택하는 currentDate, 그것을 구문 분석을 얻을, 다음 Backbone.history.fragment에서 URL을 소요에 대한 좋은 정규 표현식 임원 이전 날짜 매개 변수 (있는 경우)를 대체 한 다음 새 인코딩 날짜를 추가합니다. 그런 다음 경로를 확인하는 메소드가 호출되지 않도록 자동 모드로이 경로를 탐색합니다 (이로 인해 성가신 루프가 방지됩니다).
이 정보가 도움이되기를 바랍니다.
감사합니다, 내가 "예쁜 URL을"사용 결국은의 QueryStrings의 사용은 나에게 두통을 많이했다. regexp를 사용하여 선택한 날짜에 따라 URL을 변경했습니다. 시간과 응답에 감사드립니다. – Julian