【问题标题】:Prepending/appending hash keys in javascript / backbone在 javascript/backbone 中添加/添加哈希键
【发布时间】:2011-11-14 11:01:35
【问题描述】:

我有点进退两难。 这对于backbone.js 来说并不通用,但它肯定会导致我无法让Backbone.Router.routes 正常工作:

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

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

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

我遇到的问题是我需要在 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.在我的初始化函数上建议如下:

不错的 T.J.克劳德!!

不确定我是否应该编辑原始文件

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

【问题讨论】:

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


    【解决方案1】:

    对象文字中: 左侧的部分必须是文字(标记[例如,不带引号]或字符串文字[例如,带引号])。它不能是一个表达式。因此,您不能在对象文字中执行此操作。相反,您必须这样做:

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

    在那里,我们使用方括号表示法将属性分配给routes 对象。使用方括号表示法时,可以使用表达式来确定属性名称。它是 JavaScript 中更酷且鲜为人知的特性之一,可以使用点分表示法和文字属性名称 (obj.foo) 或括号表示法和字符串属性名称 (obj["foo"]) 来访问属性。 (事实上​​,这就是你在索引数组时所做的事情——a[0] = 5;——因为数组aren't really arrays at all。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2016-06-30
      相关资源
      最近更新 更多