在函数分配期间失败导致的全局变量
当前我正在为我工作的公司开发仪表板。这个仪表板的功能对这个问题并不有趣。本面板建立这样的:在函数分配期间失败导致的全局变量
- Asp.net页面(有ofcourse代码隐藏),其中webMethods的定义
- 的Javascript外部文件(与仪表板的所有funcitonality
- 类,这个仪表板的工作原理完全客户端)
其余的我正在使用Visual Studio 2010 Ultimate和TFS(团队基础服务器)环境,并且使用jQuery库和.NET Framework 4.0(C#)。
好吧,有了这些信息,我希望我能解释我的问题。外部JavaScript文件包含三个类。我现在将它们命名为ClassMain,ClassSub1,ClassSub2。类ClassSub1和ClassSub2从ClassMain通过执行以下操作的JavaScript命令得出:所述ClassMain其他属性和ClassSub1的方法的这个实例被加载
ClassSub1 = new ClassMain();
后。 ClassMain可以与ClassSub1的属性和方法进行通信,并且ClassSub1可以与ClassMain进行通信。所以这意味着他们像一个具有各种功能的大班级一样行事。
我解释这是因为我认为我的问题在这里,但我不确定。类ClassSub1和ClassSub2在asp.net页面的代码隐藏中得到实例化。下面的片段解释它:
StringBuilder javascriptBlockBuilder = new StringBuilder();
javascriptBlockBuilder.AppendFormat("var {0};", this.Id);
javascriptBlockBuilder.AppendFormat("Sys.Application.add_load({0}LoadHandler);", this.Id);
javascriptBlockBuilder.AppendFormat("function {0}LoadHandler() {1}", this.Id, "{");
javascriptBlockBuilder.AppendFormat("{0} = new ClassSub1('{0}');{1}", this.Id, "}");
javascriptBlockBuilder.AppendFormat("var {0};", this.OtherId);
javascriptBlockBuilder.AppendFormat("Sys.Application.add_load({0}LoadHandler);", this.OtherId);
javascriptBlockBuilder.AppendFormat("function {0}LoadHandler() {1}", this.OtherId, "{");
javascriptBlockBuilder.AppendFormat("{0} = new SubClass2('{0}');{1}", this.OtherId, "}");
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClassInitialization", javascriptBlockBuilder.ToString(), true);
在这个片段中,我在页面上创建一个全局变量,并将它分配给它。 ClassMain获得与ClassSub1和ClassSub2相同的id,以便它们使用相同的变量,因为就像我说过几行这些类必须作为一个类(ClassMain和ClassSub)一样。
这也适用,但这里也出现了这个问题。执行上述段之前(或之后)我有一些语句是这样的:
this.myButton.Attributes.Add("onclick", string.Format("{0}.myJavascriptFunctionality();", this.id));
的功能被附加到部门,按钮等
好了,现在我要去渲染我的网页和该页面加载完美,但是当我点击其中一个按钮,分区等。它告诉我,它需要一个对象。不知何故,我的全局变量与ClassSub1和ClassSub2都会丢失,现在它无法执行我的JavaScript命令。
所以我的问题是,我的变量是如何发生的?我希望我的解释足以理解。
我发现我的问题的解决方案。问题发生在两个类(ClassMain和ClassSub)之间的引用引用了相同的变量,导致javascript无法处理的错误。我做了什么来解决这个问题?
我发现这个页面上的答案:我建设我做了以下调用的对象的过程中
http://www.cristiandarie.ro/asp-ajax/JavaScriptPrototypeInheritance.html
ClassSub1.prototype = ClassMain;
ClassSub1.prototype.constructor = ClassSub1;
和:
ClassMain.call(this, id);
在哪里 '这个' 是我当前的课程和我传递'id',以便我可以参考然后我的主对象。
看起来您正在调用myButton的onclick事件中的ClassSub1.myJavascriptFunctionality()。
ClassSub1是函数定义/原型 - 无论您使用的是哪种OOP机制。你将不得不指定变量名称,而不是类名称。
像这样
this.myButton.Attributes.Add("onclick", String.Format("{0}.myJavascriptFunctionality();", this.Id));
此外,我会避免使用全局变量的方式。另一种选择是使用单一控制器方法来维护所有状态并提供仪表板对象所需的功能。 – 2010-11-12 13:36:31
我很抱歉,但我已经在我的代码隐藏中像你说的那样。我会马上更新我的帖子。任何其他想法? – 2010-11-12 13:48:12