我创建了一个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标识符才会添加到全局命名空间,而不管控件的实例数量是否添加到页面中。

其他提示

如果它只是一个值,为什么不将该函数作为参数并构建你的onclick处理程序,以便为每个控件输入正确的值。如果它比这更复杂,那么考虑将选项设置为数组,并且对于每个控件,将正确的选项插入到与每个特定控件对应的数组中的点。然后将正确的索引传递给数组中的函数。

我是通过使用ScriptManager.RegisterClientScriptBlock在客户端将字符串注册为JavaScript块来实现的。然后,我可以使用{0},{1} ..,{n}占位符修改我的脚本字符串以注入必要的ID。这取决于你的代码的结构,如果这是最优雅的方式,但它的工作紧要关头。然后,您可以使用对Me.ClientID的引用注入变量名称。

您可以将“x”的值设为“x”。静态并在代码中的任何位置访问它,例如:

function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }

这样,即使不重新设置MyObject,也可以在代码中的任何位置访问MyObject.x.

出色的解决方案安东尼。提供的其他解决方案同样好,我考虑过它们,但我正在寻找像这个解决方案更优雅的东西。 谢谢!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top