0

私は小さなゲーム/シミュレーション アプリに取り組んでおり、それ自体を更新するアプリ全体の時間変数が必要です。このシミュレーション アプリ内の時間の進行を表すために、毎秒 0..1..2..3..4 など、気になる限り増加し続ける数値変数でもかまいません。(これは JavaScript の Date オブジェクトである必要はありません)

注入したすべてのコントローラー/サービスでアクセス可能にし、アプリ全体で自動的に更新したい。この時間変数に依存する他のスコープ変数は、AngularJS が提供するすべての双方向バインディング機能で自動的に更新されます。

これは、AngularJS アプリ開発哲学の範囲内の「合法的な」行でさえありますか? もしそうなら、それを構築する最良の方法は何ですか?

4

3 に答える 3

5

必要な場所ならどこにでも注入できる特別なサービスを構築するか、単にそれを配置することができます$rootScope$rootScope通常、グローバルな状態はコードのにおいがすることが多いため、物事を に置くことは避けるべきです。ただし、それが本当に必要な場合は、これがニーズに合っている可能性があります。

そのコードをrunブロックに配置するだけで、モジュールがロードされるとすぐに実行されます。

myModule.run(['$rootScope', function($rootScope){
    setInterval(function(){
        $rootScope.now = new Date().getTime();
    }, 1000)
}]}

上記のコードを書いた方法では、Angular はその変更について通知されないことに注意してください。ただし、その変更について Angular に毎秒通知することは、重大なパフォーマンスの問題につながる可能性があるため、望ましくない場合があります。明確にするために、変更についてAngularに通知してすべてのバインディングを更新たい場合は、変数の更新を$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/

于 2013-08-24T19:48:37.233 に答える
0

あなたの質問を正しく理解したら、$rootScopeを検索します。rootScope を含める各コントローラー/ディレクティブ/サービスでは、グローバルにスローできます。

すばらしいAngularJS-Docuについては、ここをクリックしてください;)

于 2013-08-24T19:34:39.780 に答える
0

グローバル変数に を使用する$rootScopeことは、可能であれば避けるべきコード臭です。

より良い解決策は、必要なコンポーネントに注入できるファクトリ/サービスを使用することです。

詳細については、 https://stackoverflow.com/a/18882147/2596608を参照してください。

于 2015-09-18T20:32:27.110 に答える