JavaScriptオブジェクト名をASP.Netで一意にするためのアイデアはありますか?
-
03-07-2019 - |
質問
Webページ内に複数回配置されるASP.Netユーザーコントロールを作成しました。このコントロールでは、次のようなjavascriptオブジェクトを定義しました。
function MyObject( options )
{
this.x = options.x;
}
MyObject.prototype.someFunction=function someFunctionF()
{
return this.x + 1;
}
コードビハインドでは、スタートアップスクリプトでMyObjectを作成しました-
var opts = { x: 99 };
var myObject = new MyObject( opts );
コントロールの特定のボタンが押されると、myObject.someFunction()が呼び出されます。ここで、xの値は、あるコントロールでは99であるが、別のコントロールでは98になるとしましょう。ここでの問題は、var myObjectが繰り返され、最後のインスタンスのみが問題になることです。まだ出会っていない概念を使って、var myObjectを一意にする方法は確かにあります。アイデア?
ありがとう、
クレイグ
解決
次のようなJavascript:-
function MyObject(options) { this.x = options.x; }
MyObject.prototype.someFunction = function() { return this.x + 1; }
MyObject.create(id, options) {
if (!this._instances) this._instances = {};
return this._instances[id] = new MyObject(options);
}
MyObject.getInstance(id) { return this._instances[id]; }
次のような起動JavaScript:-
MyObject.create(ClientID, {x: 99});
インスタンスを使用する必要がある他のコード(クライアント側のonclickイベントなど)
String.Format("onclick=\"MyObject.getInstance('{0}').someFunction()\", ClientID);
クライアントのグローバル名前空間への影響が少ないことに注意してください。ページに追加されるコントロールのインスタンスの数に関係なく、MyObject識別子のみがグローバル名前空間に追加されます。
他のヒント
値が1つだけの場合は、関数がそれをパラメーターとして取得し、onclickハンドラーを構築して、各コントロールに正しい値を設定するようにしてください。それよりも複雑な場合は、オプションを配列にして、各コントロールについて、特定の各コントロールに対応する配列のスポットに正しいオプションを挿入することを検討してください。次に、適切なインデックスを配列の関数に渡します。
これを行うには、ScriptManager.RegisterClientScriptBlockを使用して、クライアント側でJavaScriptブロックとして文字列を登録します。その後、{0}、{1} ..、{n}プレースホルダーを使用してスクリプト文字列を変更し、必要なIDを注入できます。これが最もエレガントな方法であるかどうかは、コードの構造に依存しますが、ピンチで動作します。その後、Me.ClientIDへの参照を使用して変数名を注入できます。
" x"の値を作成できます。次のように、コード内の任意の場所で静的にアクセスします。
function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }
この方法により、MyObjectを再インスタンス化せずに、コード内のどこからでもMyObject.xにアクセスできます。
優れたソリューションAnthony。提供された他のソリューションは同じくらい良かったので、それらを検討しましたが、このソリューションのようなもう少しエレガントなものを探していました。 ありがとう!