2014-05-10 101 views
0

我試圖確定觀察一個變量的值並追蹤其變化的最佳方法,例如'language'或'time-zone',然後當它被改變根據新的價值採取一些行動。觀察一個變量的值,當它變成一個動作時

我想過使用setInterval,但我在我的網站中有很多'間隔,所以我不想過度使用它,我擔心它會影響用戶體驗。相反,我發現自己不得不觸發在每個方法中的值更改後可能會更改變量值的操作,這很簡單,但使我的代碼緊密耦合。

你對此有什麼建議。

+0

一種方法可能是將您的時區/語言更改檢測代碼放入您現有的_intervals_之一中? – Ejaz

+1

或者您可以使用自定義事件並將事件添加到_timezoneChanged_等事件中。這將消除代碼中的緊密耦合。 – Ejaz

+0

如果可以使用第三方庫(不僅僅是純JavaScript),那麼請嘗試[Knockout.js](http://knockoutjs.com/) - 它是爲這樣的推薦而創建的。 – pasty

回答

1

您應該使用Object.prototype.watch()跟蹤變量的變化

手錶()方法手錶的屬性將被分配一個值, 時發生運行的功能。 每當設置prop時將手錶賦值給名爲prop的屬性, 調用處理函數(prop,oldval,newval),並在該屬性中存儲返回值 。觀察點可以通過返回修改後的newval(或返回oldval的 )來過濾(或取消)值賦值。

如果刪除已設置了觀察點的屬性,則該觀察點不會消失。如果您稍後重新創建該物業,則觀察點仍然有效。

要刪除觀察點,請使用unwatch()方法。默認情況下, watch方法由Object後裔的每個對象繼承。

沒有標準,但您可以通過eli-grey

使用創建的gist polifill反正這是Listening for variable changes in JavaScript or jQuery

0

重複在像C++語言中,你會與存取方法做到這一點。

例如,您可以說foo.getBar(),而不是像foo.bar那樣訪問某個類的屬性。

getBar()會是這個樣子:

this.getBar = function(){ 
    console.log("bar was accessed"); 
    return bar; 
} 

你也應該有設置欄的值的方法,即

this.setBar = function(newBar){ 
    console.log("Setting the value of bar"); 
    bar = newBar; 
} 

這些方法會給你的變量更多的控制,太。例如,如果有人試圖將某個字符串分配給某個應該是整數的字符串,則可能會引發錯誤。或者,如果您有一個名爲「長度」的變量,如果有人試圖使其小於零,則可能會發出錯誤。

1

看起來好像Object.observe幾乎就是你所需要的;不幸的是,它目前被提議爲「後ECMAScript 6」規範,所以它將會持續一段時間,直到它在瀏覽器中廣泛使用。雖然有墊片實現(例如herehere),它可以爲您提供當前瀏覽器中的相同功能。

另一種方法是將有問題的對象封裝在direct proxy中,但這些是ES6的一部分,也未被瀏覽器廣泛採用。

相關問題