[英]AngularJS: How do you create app wide variable that updates itself
我正在開發一個小型游戲/模擬應用程序,並且需要一個應用程序范圍的時間變量來自我更新。 它也可能是一個數字變量,對於我來說,它一直在增加,例如,每秒0..1..2..3..4代表此模擬應用程序中的時間進度。 (本身不必是JavaScript Date Object)
我希望它可以在我注入它的每個控制器/服務中訪問,並在整個應用程序中自動更新。 然后,依賴於該時間變量的其他范圍變量將自動使用AngularJS呈現的所有雙向綁定好東西進行更新。
在AngularJS應用開發哲學中,這是否甚至是“合法”路線? 如果是的話,怎樣構造它的最佳方法是什么?
您可以為可以構建的特殊服務構建特殊服務,或者將其放在$rootScope
。 通常,您應該避免將東西放在$rootScope
因為全局狀態通常是代碼的味道。 但是,如果這確實是您所需要的,那么這可能適合您的需求。
您只需將代碼放在run
塊上,以便在模塊加載后立即執行。
myModule.run(['$rootScope', function($rootScope){
setInterval(function(){
$rootScope.now = new Date().getTime();
}, 1000)
}]}
請注意,以我上面編寫代碼的方式,不會通知Angular該更改。 但是,每秒不通知Angular更改可能不是您想要的,因為它可能導致嚴重的性能問題。 只是為了澄清一下:如果您確實希望Angular收到有關更改的通知並更新所有綁定,則變量update將需要包裝在$apply
調用中。
myModule.run(['$rootScope', function($rootScope){
setInterval(function(){
$rootScope.$apply(function(){
$rootScope.now = new Date().getTime();
});
}, 1000)
}]}
另請注意,大多數情況下您要避免使用setInterval
因為兩次處理之間的時間可能不確定。 大多數情況下, setTimeout
更適合。 進入該答案的范圍不大,但是如果您想閱讀該主題,我建議閱讀John Resig關於該主題的文章: http : //ejohn.org/blog/how-javascript-timers-work/
當我正確理解您的問題時,您將搜索$ rootScope 。 在每個包含rootScope的Controller / Directive / Service中,您都可以全局拋出內容。
如果可能,應避免將$rootScope
用於全局變量是一種代碼異味。
更好的解決方案是使用工廠/服務,您可以將其注入需要的任何組件中。
有關更多詳細信息,請參見https://stackoverflow.com/a/18882147/2596608
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.