Я часто использую шаблон Javascript Revealing Module, и мне нравится четкое разделение, которое он дает между общедоступным интерфейсом и внутренними компонентами. Однако я продолжаю сталкиваться с ситуацией, которая заставляет меня задаться вопросом, верен ли мой общий шаблон использования или мне следует использовать какой-то вариант шаблона.
Проблема заключается в том, что когда что-то, переданное в функцию инициализации модуля и сохраненное в частном порядке для внутреннего использования, также должно быть открыто для всех, либо в выражении привязки Knockout, либо в каком-либо другом модуле. Оператор return модуля выполняется немедленно, а через некоторое время вызывается функция инициализации, обычно передавая некоторые динамические параметры, такие как URL-адреса Ajax или необработанный JSON, отображаемый в блоке скрипта в представлении Razor. Поскольку оператор return модуля просто возвращает копию приватной переменной, а не ссылку, установка этой приватной переменной в функции инициализации не может изменить то, что уже было возвращено.
var productsModule = function() {
var urls;
var init = function(ajaxUrls) {
urls = ajaxUrls;
};
return {
init: init,
urls: urls,
getUrls: function() { return urls; }
};
}();
var customersModule = function() {
var doSomethingWithProductsModule = function() {
alert(productsModule.urls); // undefined
alert(productsModule.getUrls()); // object
} ;
return {
doSomethingWithProductsModule: doSomethingWithProductsModule
};
}();
var urls = {
getProduct: '/Product/'
};
productsModule.init(urls);
customersModule.doSomethingWithProductsModule();
Мой обходной путь — просто обернуть такие объекты, как «urls», в функцию, а затем получить к ним доступ через productsModule.getUrls(). Однако это становится очень запутанным, особенно если переменная является наблюдаемой Knockout, которая сама является функцией, и, следовательно, для ее оценки мне нужно использовать двойные скобки, такие как productsModule.getMyObservable()().
Есть ли более приятный способ получить актуальные внутренние значения, используя что-то, что хотя бы приближается к шаблону раскрывающегося модуля?