在javascript / backbone中添加哈希键

Prepending/appending hash keys in javascript / backbone

本文关键字:添加 哈希键 backbone javascript      更新时间:2023-09-26

我有点进退两难。这并不适用于backbone.js,但它确实给我带来了问题,使Backbone.Router.routes工作:

问题:我有一堆硬编码的路由在我的js这些遵循一个键值对哈希模式,如:

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

这基本上是将url绑定到一个函数名,以便在url更改时调用。

问题是我需要在url前加上一个lang/locale字符串,这样字符串看起来就像"/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",…

no dice again.

肯定有一种方法可以动态地添加哈希键?

有人知道吗?

Thanks very much

解决方案感谢T.J.(见下文)

如果有人对这个在Backbone.js特定的方式感兴趣。我所做的是使用下面T.J.对我的初始化函数建议的解决方案,如下所示:

好T.J.Crowder ! !

不确定是否应该编辑原文

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

对象字面值:左侧的部分必须是一个字面值(标记[例如,不带引号]或字符串字面值[例如,带引号])。它不能是表达式。所以你不能在对象字面量中这样做。相反,您必须这样做:

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

在这里,我们使用括号中的符号将属性分配给routes对象。当使用括号表示法时,可以使用表达式来确定属性名。这是JavaScript的一个更酷但不太为人所知的特性,即可以使用点符号和文字属性名(obj.foo)或括号符号和字符串属性名(obj["foo"])访问属性。(事实上,当你索引到arrays —a[0] = 5;,本;因为数组根本就不是数组)