-1

我有一个组用户控件,并且在控件中定义了 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;
}());

谁能告诉我如何访问页面上的第一组变量(控件)。我认为像 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;
    }());

问题是我在页面上有两个这样的组控件。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

通过

Groups.selectedid

但是,如果它在相同的代码中,将不起作用,因为您为相同的变量分配了不同的值。你需要分开:

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

您应该在控件中为应该引用组的 js 变量生成 GUID(这可以是控件的 id 加上一些前缀)。并用它们创建全局数组。在这种情况下,您可以随时访问您的群组

于 2012-09-21T18:25:27.010 回答
0

如果这两个片段都声明了一个全局 ( EVIL ) 变量Groups,那么一旦调用第二个匿名函数,第一个对象就会永远丢失。就这么简单,恐怕。如果它们不是全局变量,并且是不同范围的一部分,那么访问属性很简单:

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

您需要提供两个不同的名称:

var Groups1 = ...

var Groups2 = ...

之后您可以访问Groups1.selectedid

但我不清楚这些对象和变量的目的是什么。

于 2012-09-21T18:23:27.263 回答
0

两个var Groups声明定义了相同的内存位置。

所以你的第二个陈述

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

将覆盖先前存储在 Groups 变量中的值。

如果您想将 Groups 作为一个集合访问,您应该明确地执行此操作:

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

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