0

我创建了一个 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 使用一些我还没有遇到过的概念独一无二。想法?

谢谢,

克雷格

4

5 回答 5

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 标识符被添加到全局命名空间,而不管有多少控件实例被添加到页面中。

于 2009-01-02T11:50:04.940 回答
0

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

于 2009-01-02T02:40:37.743 回答
0

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

于 2009-01-02T03:53:33.897 回答
0

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

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

这样您就可以在代码中的任何位置访问 MyObject.x,甚至无需重新实例化 MyObject。

于 2009-01-02T04:22:09.957 回答
0

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

于 2009-01-02T14:54:47.280 回答