2012-09-21 63 views
-1

我有一個組用戶控件,並且在控件內部定義了javascript。在一個頁面中,我有兩個獨立工作的控件。渲染JavaScript是類似下面的東西:訪問具有相同名稱的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組變量(控制)。我認爲像組[0]會給我的結果,但事實並非如此。


感謝您的回覆。非常感激。我正在添加更多信息以便清楚。用戶控件包含雙列表框,用戶可以添加/刪除從列表1到列表2的值。所以我已經封裝了所有這些邏輯如下。

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; 
    }()); 

問題是我在頁面上有兩個這樣的組控件。組1包含它自己的雙重列表並且類似於組2。現在,我需要訪問兩個對象的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(); 
+0

你的第二個'Groups'變量覆蓋你的第一個'Groups'變量。 –

回答

0

兩個var Groups聲明定義相同的內存位置。

所以你的第二個聲明

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

將覆蓋組變量以前保存的值。

如果你想訪問組作爲一個集合,你應該明確地做到這一點:

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

Groups.push(...); // control 1 
Groups.push(...); // control 2 
+0

感謝您的回覆。但是如何定義集合,因爲在用戶控件中我不知道它被放置在頁面上多少次。 – Sunny

+0

這個回覆給了我一個想法,所以標記爲答案。 – Sunny

0

如果這兩個片段聲明一個全局(EVIL)可變Groups,那麼第一個對象是永遠失去了曾經的第二個匿名函數被調用。恐怕就這麼簡單。如果他們不是全局和不同範圍的一部分,那麼它的訪問屬性的一個簡單的問題:

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

組的值是對obj對象的引用,匿名函數聲明,並立即調用(封閉),並返回一個對象,其中selectedid作爲屬性。因此Group具有該屬性。

var Groups = (function()//assign return value 
{ 
    return [2];//return this value 
})();//call the function 
+0

我想我有相同的代碼顯示,無法訪問組[0]。 – Sunny

+0

哦,我缺少返回數組。但就我而言,這不僅僅是一個數組。它是一個具有公共變量和功能的對象。 – Sunny

0

你需要給兩個不同的名稱:如果你的代碼是沿着線的東西Groups[0]會工作

var Groups1 = ... 

var Groups2 = ... 

之後,你可以訪問Groups1.selectedid

但是,目前尚不清楚對我來說這些對象和變量的目的是什麼?

0

通過

Groups.selectedid 

但如果它是在相同的代碼,將無法正常工作,因爲您分配不同的值相同的變量。你需要單獨:

var Groups1 = ... 
var Groups2 = ... 
0

你應該生成GUID的控制變量的JS應該被稱爲組內(這種控制加上一些前綴可ID)。 並與他們創建全局數組。在這種情況下,您將可以隨時訪問您的羣組

相關問題