2009-01-02 15 views
0

我創建了一個ASP.Net用戶控件,它會在網頁中放置多次。在該控制中,我定義javascript對象,例如:在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獨一無二。想法?

感謝,

克雷格

回答

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標識符被添加到全局名稱空間,無論您的控件的多少實例添加到頁面。

0

如果它僅僅是一個值,爲什麼不具備的功能把它作爲一個參數,建立自己的onclick處理程序,以便它把在每個控制正確的值。如果它比這更復雜,那麼考慮將選項作爲數組,對於每個控件,將正確的選項插入到與每個特定控件相對應的數組中的位置。然後將適當的索引傳入數組到函數中。

0

我通過使用ScriptManager.RegisterClientScriptBlock將字符串註冊爲客戶端上的JavaScript塊來完成此操作。然後我可以使用{0},{1} ..,{n}佔位符修改腳本字符串以注入必要的ID。這取決於你的代碼的結構,以確定這是否是最優雅的時尚,但它在一個捏。然後,您可以使用對Me.ClientID的引用來注入變量名稱。

0

可以使「X」靜態值和任何地方訪問它的代碼,如:

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

這樣你就可以在任何地方訪問MyObject.x在你的代碼,甚至不需要重新instanciating爲MyObject。

0

優秀的解決方案安東尼。提供的其他解決方案同樣出色,我確實考慮過它們,但我一直在尋找像這種解決方案更加優雅的東西。 謝謝!