2

AngularJSで定義されたサービスがあります。定義したapp.factory("serviceName", function($rootScope) { .. }) 場合$rootScope.$apply()、アプリ内のすべてのコントローラーのスコープを再評価しますか、それともこのサービスを使用するコントローラーのスコープのみを再評価しますか?

4

3 に答える 3

5

$digest()は、現在のスコープとそのすべての子スコープのみを「フラッシュ」します。

$apply(exp)は exp を評価し、ルート スコープで $digest() を呼び出します。したがって、(任意のスコープで) $apply() を呼び出すと、すべてのスコープに影響します。

$digest() を呼び出し、アクションが親スコープを変更した場合、その変更は監視されません。したがって、通常は $apply() を呼び出します。($digest() を呼び出してより効率的にしようとする場合は、後で噛まれる可能性があります!)

于 2012-12-17T16:57:41.697 に答える
1

以下のコードは、2秒ごとにログに記録され、コンソールにMyCtrl記録されます。これは、$applyを任意の$scopeに適用すると、すべてのスコープがダイジェストされることを示しています。問題は、適用された関数がどのスコープに対して実行されるかです。適用されたスコープのみをダーティチェックする場合は、ログに記録しないでください。ここでフィドル。MyCtrl2MyCtrl

var mod = angular.module('MyApp', []);

mod.controller('MyCtrl', function($scope) {
    $scope.value = function() {
        console.log('MyCtrl');
        return 'value';
    };

    setInterval(function() {
        $scope.$apply()
    }, 2000);
});

mod.controller('MyCtrl2', function($scope) {
    $scope.value2 = function() {
        console.log('MyCtrl2');
        return 'value 2';
    };
});​
<div ng-app="MyApp">
  <div ng-controller="MyCtrl">{{value()}}</div>
  <div ng-controller="MyCtrl2">{{value2()}}</div>
</div>​
于 2012-12-17T10:56:51.747 に答える
1

アプリケーションごとに 1 つのルート スコープしかありません。を呼び出すと、スコープ ツリー全体$rootScope.$apply()をダーティ チェックするダイジェスト サイクルがトリガーされます。

これを回避するには、$apply複数の兄弟スコープをダーティ チェックする場合は、コントローラーのスコープまたはその親スコープから呼び出します。

于 2012-12-17T00:59:57.887 に答える