簡體   English   中英

AngularJS:如何創建可自我更新的應用范圍變量

[英]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中,您都可以全局拋出內容。

點擊這里查看真棒 AngularJS-Docu;)

如果可能,應避免將$rootScope用於全局變量是一種代碼異味。

更好的解決方案是使用工廠/服務,您可以將其注入需要的任何組件中。

有關更多詳細信息,請參見https://stackoverflow.com/a/18882147/2596608

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM