-1

グループユーザーコントロールがあり、JavaScriptがコントロール内で定義されています。1つのページに、独立して機能する2つのそのようなコントロールがあります。レンダリングされたJavaScriptは、次のようなものです。

//control 1
var Groups = (function () {
var obj = {};
obj.selectedid = 2;
return obj;
}());

//control 2
var Groups = (function () {
var obj = {};
obj.selectedid = 2; //it is different here, to keep it simple i just hardcoded as '2'
return obj;
}());

ページの1番目のグループ変数(コントロール)にアクセスする方法を教えてください。Groups [0]のようなもので結果が得られると思いましたが、そうではありません。


返信ありがとうございます。とても有難い。明確にするために、さらに情報を追加しています。ユーザーコントロールにはデュアルリストボックスが含まれており、ユーザーはlist1からlist2に値を追加/削除できます。したがって、このロジックをすべて以下のようにカプセル化しました。

    var Groups = (function () {
    var obj = {};
    obj.selectedid = 2;

    //some local functions for internal operations such as
    function moveGroups(source, target){        
    }

     //there are public functions to initialize this control or to add groups as below 
    // Groups can be added from external page by calling  Groups.AddGroups(data);
    obj.AddGroups = function(data) {
           //refers to local variables and functions and adds data to listboxes
      };

    return obj;
    }());

問題は、ページにそのようなグループコントロールが2つあることです。Group1には、独自のデュアルリストと同様にGroup2が含まれています。ここで、両方のオブジェクトのAddGroups関数にアクセスする必要があります。これは、ページからGroups1.AddGroups(data)またはGroups2.AddGroups(data)のように独立して機能します。


私は以下の解決策で解決しました。

var Groups = Groups || []; //Check object already exists
Groups.push( 
//kept all the existing code here...
(function () {
    var obj = {};
    obj.selectedid = 2;

    //some local functions for internal operations such as
    function moveGroups(source, target){        
    }

     //there are public functions to initialize this control or to add groups as below 
    // Groups can be added from external page by calling  Groups.AddGroups(data);
    obj.AddGroups = function(data) {
           //refers to local variables and functions and adds data to listboxes
      };

    return obj;
    }())

);

今私のページでは、私は使用して参照します:

Groups[0].AddAvailGroups();
Groups[1].AddAvailGroups();
4

5 に答える 5

0

2つのvar Groups宣言が同じメモリ位置を定義します。

だからあなたの2番目のステートメント

//control 2
var Groups = (function () {

以前にGroups変数に保存された値を上書きします。

コレクションとしてグループにアクセスする場合は、これを明示的に行う必要があります。

var Groups = []; // array/list;

Groups.push( ... ); // control 1
Groups.push( ... ); // control 2
于 2012-09-21T18:28:41.467 に答える
0

これらのスニペットの両方がグローバル(EVIL)変数Groupsを宣言している場合、2番目の無名関数が呼び出されると、最初のオブジェクトは永久に失われます。それはそれと同じくらい簡単です、私は恐れています。それらがグローバルではなく、異なるスコープの一部である場合は、プロパティにアクセスするだけです。

Groups.selectedid;//will be either 1 or 2 depending on the scope. 

groupsの値はobjオブジェクトへの参照であり、無名関数は宣言されてすぐに呼び出され(クロージャ)、プロパティとしてオブジェクトを返しselectedidます。したがってGroup、そのプロパティがあります。Groups[0]あなたのコードが次のようなものであればうまくいくでしょう:

var Groups = (function()//assign return value
{
    return [2];//return this value
})();//call the function
于 2012-09-21T18:23:13.237 に答える
0

2つの異なる名前を付ける必要があります:

var Groups1 = ...

var Groups2 = ...

その後、アクセスできますGroups1.selectedid

しかし、これらのオブジェクトと変数の目的が何であるかは私にはわかりません。

于 2012-09-21T18:23:27.263 に答える
0

終えた

Groups.selectedid

ただし、同じコード内にある場合は、同じ変数に異なる値を割り当てたため、機能しません。分離する必要があります:

var Groups1 = ...
var Groups2 = ...
于 2012-09-21T18:25:03.510 に答える
0

グループを参照する必要があるjs変数のコントロール内にGUID(コントロールのIDとプレフィックスを追加できます)を生成する必要があります。そして、それらを使用してグローバル配列を作成します。この場合、いつでもグループにアクセスできるようになります

于 2012-09-21T18:25:27.010 に答える