我有一点点困境。 这对于backbone.js来说并不通用,但它确实导致我在Backbone.Router.routes工作时出现问题:
问题: 我在我的js中有一堆硬编码路由,它们遵循键值对散列模式,如:
whatever.route : {"/url/goes/here":"functionNameHere"}
基本上它的作用是将URL绑定到函数名称,以便在URL更改时调用。
我遇到的问题是我需要在lang / locale字符串前面添加url,以便字符串看起来像“/ en / url / goes / here”
// 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
}
);
我的初步想法是:
....routes{ lang+"/url/goes/here": "functionNameHere",
...
没有骰子错误 接下来我尝试使用:
.... routes {eval(lang +“/ url / goes / here”):“functionNameHere”, ...
再没有骰子..
肯定有一种方法可以动态地动态添加哈希键吗?
任何?
非常感谢
解决方案感谢T.J. (见下文)
如果有人对Backbone.js的具体方式感兴趣。 我做的是使用解决方案T.J.我的初始化函数如下所示:
Nice T.J.Crowder !!
不确定我是否应该编辑orig
initialize: function(params){
var tmpr = {};
for(var i in params.routes)
{
tmpr[params.lang+i] = params.routes[i];
}
this.routes = tmpr;
......
答案 0 :(得分:1)
对象文字中:
左侧的部分必须是文字(标记[例如,没有引号]或字符串文字[例如,带引号] )。它不能是一种表达。所以你不能在对象文字中这样做。相反,你必须这样做:
var routes = {};
routes[lang + "/url/goes/here"] = "functionNameHere";
// ...
workspace = new Workspace(
{
routes: routes,
lang : lang
}
);
在那里,我们使用括号表示法为routes
对象分配属性。使用括号表示法时,可以使用表达式来确定属性名称。它是JavaScript的一个较酷且不太知名的特性,可以使用点分表示法和文字属性名称(obj.foo
)或括号表示法和字符串属性名称({{1} })。 (事实上,当你索引数组时,这就是你正在做的事情 - obj["foo"]
- 因为数组aren't really arrays at all。)