Javascript Revealing Module模式 - 在函数返回后公开初始化变量

Tom*_*all 6 javascript revealing-module-pattern knockout.js

我一直在使用Javascript Revealing Module模式,我喜欢它在公共接口和内部之间的明确分离.但是我一直遇到一种情况,这让我想知道我的整体使用模式是否正确,或者我是否应该使用该模式的某些变体.

问题是,当某些内容传递到模块的init函数并私有存储以供内部使用时,还需要在Knockout绑定表达式或其他模块中公开公开.模块的return语句立即执行,稍后调用init函数,通常会传递一些动态参数,如Ajax URL或Razor视图中脚本块中呈现的原始JSON.因为模块的return语句只返回私有变量的副本而不是引用,所以我在init函数中设置的私有变量不能改变已经返回的内容.

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();
Run Code Online (Sandbox Code Playgroud)

我的解决方法是在函数中包装诸如"urls"之类的对象,然后通过productsModule.getUrls()访问它们.然而,这变得非常混乱,特别是如果变量是一个Knockout observable,它本身就是一个函数,因此为了评估它我需要使用像productModule.getMyObservable()()这样的双括号.

是否有更好的方法来使用至少接近显示模块模式的东西来获取最新的内部值?

Tom*_*all 2

虽然我不完全喜欢必须迭代对象的所有可能级别才能像这样合并它们的想法,但 El Yobo 的回答让我考虑将模块函数本身的结果作为一个局部变量,我可以更新其属性。

var productsModule = function() {

var urls;

var init = function(ajaxUrls) {
urls = ajaxUrls;
result.urls = urls;
};

var result = {
init: init,
urls: urls
};

return result;

}();


// Before init
alert(productsModule.urls); // undefined

var urls = {
getProduct: '/Product/'
};

productsModule.init(urls);

alert(productsModule.urls.getProduct); // /Product/
Run Code Online (Sandbox Code Playgroud)