2011-11-14 2 views
0

약간의 딜레마가 있습니다. 이 backbone.js에 일반 아니지만 확실히 작동 Backbone.Router.routes을 받고 나에게 문제를 일으키는 :자바 스크립트/백본에 미리 추가/해시 키 추가

문제 : 내 JS에서 하드 코드 경로의 무리가 이러한 키 값 쌍을 따르십시오 해시 패턴은 다음과 같습니다.

whatever.route : {"/url/goes/here":"functionNameHere"} 

기본적으로 이것은 URL이 변경되면 호출 할 함수 이름에 URL을 바인딩하는 것입니다.

내가 가진 문제는 내가 문자열의 모습 있도록 LANG/로케일 문자열로 URL을 붙일 필요가있다 "/ EN/URL// 여기 간다"

// this will always return "en" or "fr" or aany 2 letter language code  
var lang = window.location.pathname.split("/")[1].length ==2?window.location.pathname.split("/")[1]:false; 


workspace = new Workspace(//Workspace is basically just a Backbone.router.extend Object 
      { 
       // the routes obj is basically a sequence of routes 
       routes: { 
        "/":     "home", 
        "/home":    "home", 
        "/terms":    "terms", 
        "/news":    "blog", 
        "/news/:title":   "blogpost", 
        "/about":    "about", 
        "/about/partners":  "partners", 
        "/about/people":  "people", 
        "/values/ethics":  "ethics", 
        "/values/innovation": "innovation", 
        "/work":    "work", 
        "/work/process":  "process", 
        "/work/awards":   "awards", 
        "/work/:id":   "workdetail", 
        "/contact":    "contact", 
        "/contact/join":  "joinus", 
        "/contact/enquiries": "enquiries" 
       }, 
       lang : lang 
      } 
     ); 

내 intial 생각했다

....routes{ lang+"/url/goes/here": "functionNameHere", 
... 

없는 주사위 오류 다음 내가 사용해보십시오 :의 라인을 따라 {평가를

.... 루트 (LANG + "/ URL이// 여기 간다") : "functionNameHere",,개 ...

어떤 주사위 다시 ..

반드시 동적으로 즉석에서 해시 키를 앞에 추가 할 수있는 방법은 프로그래머?

누구나? T.J.에

정말 감사합니다

솔루션 덕분에 (아래 참조)

누군가가 Backbone.js와 같은 방식으로 이에 관심이 있다면. 내가 한 것은 T.J. 솔루션을 사용하는 것이 었습니다. 내 초기화 함수에 아래처럼 제안 :

Nice T.J.Crowder !!

확실하지 나는 오리지널 [따옴표없이 예]

initialize: function(params){ 
     var tmpr = {}; 
     for(var i in params.routes) 
     { 
      tmpr[params.lang+i] = params.routes[i]; 
     } 
     this.routes = tmpr; 
...... 

답변

1

리터럴 (토큰이어야 객체 리터럴의 :의 왼쪽에있는 일부 또는 문자열을 편집해야하는 경우 리터럴 [예 : 따옴표 포함]). 그것은 표현이 될 수 없습니다. 그래서 당신은 객체 리터럴에서 이것을 할 수 없습니다. 대신, 당신은이 작업을 수행해야합니다 :

var routes = {}; 
routes[lang + "/url/goes/here"] = "functionNameHere"; 
// ... 
workspace = new Workspace(
      { 
       routes: routes, 
       lang : lang 
      } 
     ); 

이, 우리가 routes 객체에 속성을 할당하기 위해 괄호 표기법을 사용하고 있습니다. 브라켓 표기법을 사용할 때 표현식을 사용하여 특성 이름을 판별 할 수 있습니다. 점으로 구분 된 표기법과 리터럴 속성 이름 (obj.foo) 또는 대괄호 표기법 및 문자열 속성 이름 (obj["foo"])을 사용하여 속성에 액세스 할 수있는 덜 시원하고 덜 잘 알려진 JavaScript 기능 중 하나입니다. 배열로 배열 할 때 실제로 그 일은 배열 aren't really arrays at all이기 때문에   — a[0] = 5;   —입니다.