在javascript / backbone中预先添加/附加哈希键

时间:2011-11-14 11:01:36

标签: javascript jquery model-view-controller backbone.js

我有一点点困境。 这对于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;
......

1 个答案:

答案 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。)