2010-11-12 100 views
1

當前我正在爲我工​​作的公司開發儀表板。這個儀表板的功能對這個問題並不有趣。本面板建立這樣的:在函數分配期間失敗導致的全局變量

  • 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命令。

所以我的問題是,我的變量是如何發生的?我希望我的解釋足以理解。

回答

0

我發現我的問題的解決方案。問題發生在兩個類(ClassMain和ClassSub)之間的引用引用了相同的變量,導致javascript無法處理的錯誤。我做了什麼來解決這個問題?

我發現這個頁面上的答案:我建設我做了以下調用的對象的過程中

http://www.cristiandarie.ro/asp-ajax/JavaScriptPrototypeInheritance.html

ClassSub1.prototype = ClassMain; 
ClassSub1.prototype.constructor = ClassSub1; 

和:

ClassMain.call(this, id); 

在哪裏 '這個' 是我當前的課程和我傳遞'id',以便我可以參考然後我的主對象。

0

看起來您正在調用myButton的onclick事件中的ClassSub1.myJavascriptFunctionality()。

ClassSub1是函數定義/原型 - 無論您使用的是哪種OOP機制。你將不得不指定變量名稱,而不是類名稱。

像這樣

this.myButton.Attributes.Add("onclick", String.Format("{0}.myJavascriptFunctionality();", this.Id)); 
+0

此外,我會避免使用全局變量的方式。另一種選擇是使用單一控制器方法來維護所有狀態並提供儀表板對象所需的功能。 – 2010-11-12 13:36:31

+0

我很抱歉,但我已經在我的代碼隱藏中像你說的那樣。我會馬上更新我的帖子。任何其他想法? – 2010-11-12 13:48:12