2013-08-22 2 views
1

Я разрабатываю интерфейс с использованием Backbone.js и require.js, и все идет хорошо, пока мне не нужно создать файл с именем it. config.js, чтобы сохранить некоторую неправку значения, чтобы использовать его в целом примененияОпределить глобальные значения с помощью AMD require.js & backbone.js

ниже код из config.js файла

// Filename: config.js 
define([''], function(){   

var baseUrl = "http://localhost:8888/client/", 
apiServer = "http://api-server:8888"; 

return function(type){ 
    return eval(type); 
}; 

}); 

в одном из моих взглядов, я бы определить config.js тогда я могу получить доступ к значению оба

var baseUrl = "http://localhost:8888/client/", 
apiServer = "http://api-server:8888"; 

с помощью этой строки кода ниже, что я положил его в любой * .js файл на моем приложении

var baseUrl = config('baseUrl'); 
console.log(baseUrl); //prints out this > http://localhost:8888/client/ 

проблема здесь я использую Eval, чтобы получить значение, какое значение я должен отыскивает, я знаете, что это не безопасный метод для использования, но может ли кто-нибудь предложить безопасное решение.

ответ

2

RequireJS позволяет вам определять объекты так же, как вы определяете более сложные модули. Вы можете иметь конфигурационный модуль, а затем использовать его в любом другом файле, который ему нужен.

Внутри config.js вы можете сделать:

define({ 
    baseUrl:"http://localhost:8888/client/", 
    apiServer:"http://api-server:8888" 
}); 

Затем требуют в других модулях:

//someotherfile.js , defining a module 
define(["config"],function(config){ 
    config.baseUrl;// will return the correct value here 
    //whatever 
}); 

Side Примечание: Вы можете использовать фактическое глобальное состояние (определение переменной на окне), но я настоятельно призываю вас не делать это, так как это сильно усложнит тестирование и сделает зависимость неявной и не явной. Явные зависимости всегда должны быть предпочтительными. В приведенном выше коде и, в отличие от глобального, совершенно ясно, что конфигурация требуется модулями, использующими его.

Обратите внимание, что если вы хотите, чтобы значения, которые являются недопустимыми идентификаторами, вы также можете использовать синтаксис в виде скобок config["baseUrl"], то два (то и config.baseUrl) идентичны в JavaScript.

+0

Что я сказал в своем ответе, было общим для JavaScript, но если вы заинтересованы в базовом ориентированном руководстве для AMD и RequireJS, я настоятельно рекомендую [эту главу] (http://addyosmani.github.io/backbone-fundamentals/# organiz-modules-with-requirejs-and-amd) в бесплатной книге Addy Osmani. –

1

В качестве альтернативного решения (и уродливее, чем Бенджамина) вы можете поместить оба адреса в объект:

define([''], function(){   

    var urls = { 
     baseUrl: "http://localhost:8888/client/", 
     apiServer: "http://api-server:8888" 
    }; 

    return function(type){ 
     return urls[type]; 
    }; 

}); 

Тем не менее, просто экспортировать объект намного чище.

+0

С другой стороны, это дает доступ только для чтения (для чего требуется вызов 'Object.freeze' до первого' {'на другой версии или что-то подобное. (Затем опять же зачем кому-то переопределять их конфигурацию в первую очередь) –

+0

@BenjaminGruenbaum heh, не думал об этом. Думал бы больше в строке изменений кода, если у OP уже есть 'config ('baseUrl')', посыпанный по всему его проекту. Хороший звонок! – soulcheck

Смежные вопросы