Добавление / добавление хеш-ключей в javascript / backbone - PullRequest
0 голосов
/ 14 ноября 2011

У меня небольшая дилемма.Это не является общим для backbone.js, но, безусловно, вызывает у меня проблемы с работой Backbone.Router.routes:

Проблема: у меня есть несколько жестко закодированных маршрутов в моем js, они следуют за парой ключ-значениеПример хеш-функции:

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

В основном это связано с привязкой URL-адреса к имени функции, вызываемой при изменении URL-адреса.

У меня проблема в том, что мне нужно добавитьURL со строкой lang / locale, чтобы строка выглядела как "/ en / url / go / 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",
...

нет ошибок в кости, затем я пытаюсь использовать:

.... маршрутов {eval (lang + "/ url / идет / здесь"): "functionNameHere", ...

без игры в костиеще раз ..

наверняка есть способ динамического добавления хеш-ключа на лету?

Кто-нибудь?

Большое спасибо

РешениеСпасибо TJ (см. Ниже)

Если кто-то заинтересован в этом специфическим способом Backbone.js.Я использовал решение TJ, предложенное ниже, для моей функции инициализации, например так:

Хороший TJCrowder !!

не уверен, стоит ли мне редактировать orig

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

1 Ответ

1 голос
/ 14 ноября 2011

Часть слева от : в литерале объекта должна быть литералом (либо токеном [например, без кавычек], либо строковым литералом [например, с кавычками]). Это не может быть выражением. Таким образом, вы не можете сделать это в объектном литерале. Вместо этого вам придется сделать это:

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

Там мы используем обозначение в скобках, чтобы назначить свойства для объекта routes. Когда вы используете нотацию в скобках, вы можете использовать выражение для определения имени свойства. Это одна из круче и менее известных функций JavaScript, которая позволяет получить доступ к свойствам либо с помощью точечной нотации, и с буквальным именем свойства (obj.foo), либо в скобках, а также с именем строкового свойства (obj["foo"]). (Фактически это то, что вы делаете, когда индексируете массивы & mdash; a[0] = 5; & mdash; поскольку массивы на самом деле не являются массивами .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...