2016-09-03 10 views
21

角度フレームワークに新しく追加されました。私の場合は、$ scope.variableを一定期間後に変更したいので、javascript setTimeoutメソッドを使用しました。

$scope.variable='Previous'; 

setTimeout(function(){ 
$scope.variable='NEXT'; 
},3000); 

このコードは機能しません。私は$apply()を使ってこのコードを動作させました。

その後、私はangle自身が同じ仕事をする$ timeoutサービスを持っていることを知りました。私はjavascriptのsetTimeout$timeoutサービスのパフォーマンスを比較するにはどうすればよい

$scope.variable='Previous'; 
     $timeout(function() { 
      $scope.variable='NEXT'; 
    }, 2000); 

setTimeoutの代わりに$timeoutを使用する理由

パフォーマンスを示すいくつかの例と理由を教えてください。

感謝:)

+1

パフォーマンスは、現在のアプリケーション内のダイジェストサイクルのパフォーマンスに完全に依存します。 $ timeoutはダイジェストを引き起こします。かなりの量のウォッチャーを持つアプリケーションの場合、 '$ rootScope。$ digest() 'はアプリケーションをフリーズさせ、もう一度フリーズします。それはそれと同じくらい簡単です。 – estus

答えて

17

何らかの種類のタイムアウト操作を実行する必要があり、JavaScriptのsetTimeout()機能を使用して頻繁にこれを達成する場合があります。我々はAngularJSアプリケーションでsetTimeout()を使用する場合

しかしながら、我々はまた、scopeの変更(すなわちviewにデータバインド)他の場所に反映されることを保証するために$scope.$apply()を使用する必要があります。

AngularJSは、このための便利なラッパーを提供します:$timeout() - それはどのために、我々は変化$applyする必要はありません$apply()を行います。

パフォーマンスについては、

$timeoutを使用して基本的に間隔を作成する場合は、使用しないでください。あなたのアプリケーションが大きい場合、$applyも実際には起こりたくないかもしれない$digestサイクルをトリガーしますが、それは確かにパフォーマンスを低下させます。

14

どれAngularJSスコープ変数外(AJAXを含む)から取り扱わ)$(適用されます必要があります。

$ timeout()は現在のスコープを処理し、すべての変更検出が完了した後に同じダイジェストサイクルで実行されます。

私が最近発見した$ timeout()の美しさは、timeパラメータを渡さないとDOMの完了を待つことです。

ので、

$timeout(function(){ 
    console.log("show after directive partial loaded") 
}); //note, no time parameter 

実行部分はこのことができますディレクティブ

希望によってロードされた後ディレクティブとタイムアウトコールバック関数でこのコードが発行されます。

+2

さらに、$ timeoutに2番目のパラメータとしてfalseを渡すことができ、$ applyは呼び出されません。 $ digestを手作業で制御したいときに便利です – Ladmerc

+0

詳細はあいまいで、誤った情報が含まれている可能性があります。ディレクティブの使用に関するステートメントは遠くにフェッチされており、実際にsetTimeout + $ scopeとどのように違うのか説明していません。 '$ timeout(()=> {...}、...)'は基本的に 'setTimeout(()=> $ scope。$ apply(..)、...)'と同じですが、前者は '$ timeout.flush()'で同期的にテストすることができます(ダイジェストをスキップするオプションもあります)。 – estus

関連する問題