私は Javascript Revealing Module パターンを頻繁に使用しており、パブリック インターフェイスと内部を明確に分離できる点が気に入っています。しかし、全体的な使用パターンが正しいかどうか、またはパターンの変形を使用する必要があるかどうか疑問に思う状況に遭遇し続けています。
問題は、モジュールの init 関数に渡され、内部使用のためにプライベートに保存された何かが、Knockout バインディング式または他のモジュールで公開される必要がある場合です。モジュールの return ステートメントがすぐに実行され、しばらくしてから init 関数が呼び出されます。通常は、Razor ビュー内のスクリプト ブロックでレンダリングされる Ajax URL や生の 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();
私の回避策は、「url」などのオブジェクトを関数でラップし、productsModule.getUrls() を介してそれらにアクセスすることです。ただし、変数がそれ自体が関数である Knockout オブザーバブルである場合は特に、これは非常に厄介になります。そのため、変数を評価するには、productsModule.getMyObservable()() のような二重括弧を使用する必要があります。
明らかにモジュールパターンに少なくとも近似するものを使用して、最新の内部値を取得するより良い方法はありますか?