2012-09-21 64 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)。 并与他们创建全局数组。在这种情况下,您将可以随时访问您的群组

相关问题