私はJavascript Revealing Moduleパターンを多用していました。私はパブリックインターフェイスと内部の間の明確な分離が好きです。しかし私は、私の全体的な使用パターンが正しいかどうか、またはパターンのいくつかの変形を使用すべきかどうか疑問に思うような状況に陥っています。Javascript Revealing Moduleパターン - 関数が返された後の初期化変数を公開する
問題は、モジュールのinit関数に渡され、内部使用のために非公開で保存されたものが、Knockoutバインディング式または他のモジュールのいずれかで公開される必要がある場合です。モジュールのreturn文はすぐに実行され、後でinit関数が呼び出されます。通常、Razorビュー内のスクリプトブロックにレンダリングされたAjax URLやraw JSONなどの動的パラメータが渡されます。モジュールのreturn文は、参照ではなくprivate変数のコピーを返すだけなので、init関数内のprivate変数ですでに返されたものを変更することはできません。
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(経由でそれらにアクセスすることです。しかし、それは非常に乱雑になります。特に、変数がノックアウト観測値であり、それ自体が関数なので、評価するためにproductsModule.getMyObservable()()のような二重括弧を使用する必要があります。
最新の内部値を得るには、少なくとも明らかにするモジュールパターンに近いものを使用する方が良いですか?
単純なオブジェクトを渡すだけの場合は、マージするオーバーヘッドが最小限に抑えられますが、これはよりよく見えます。 –
私自身の答えを受け入れるために私の奇妙な、しかし正しい方向に私を指してくれてありがとう。 –
@TomHall:あなた自身の答えを受け入れても問題ありません。答えに質問を書くことはできません。 –