我创建了一个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独一无二。想法?
谢谢,
克雷格
答案 0 :(得分:1)
你的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标识符才会添加到全局命名空间,无论您的控件的实例数量是多少都添加到页面中。
答案 1 :(得分:0)
如果它只是一个值,为什么不将该函数作为参数并构建你的onclick处理程序,以便为每个控件输入正确的值。如果它比这更复杂,那么考虑将选项设置为数组,并且对于每个控件,将正确的选项插入到与每个特定控件对应的数组中的点。然后将正确的索引传递给数组中的函数。
答案 2 :(得分:0)
我是通过使用ScriptManager.RegisterClientScriptBlock在客户端将字符串注册为JavaScript块来实现的。然后,我可以使用{0},{1} ..,{n}占位符修改我的脚本字符串以注入必要的ID。这取决于你的代码的结构,如果这是最优雅的方式,但它的工作紧要关头。然后,您可以使用对Me.ClientID的引用注入变量名称。
答案 3 :(得分:0)
您可以将“x”的值设为静态,并在代码中的任何位置访问它,例如:
function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }
这样,即使不重新设置MyObject,也可以在代码中的任何位置访问MyObject.x.
答案 4 :(得分:0)
出色的解决方案安东尼。提供的其他解决方案同样好,我考虑过它们,但我正在寻找像这个解决方案更优雅的东西。 谢谢!