1

'use strict';

angular.module('app', [])

.controller('MainCtrl', function($scope) {
  console.log('heyo')
})

.directive('panel', function() {
  return {
    template: '<div ng-if="isAuthenticated()">Im In!</div>',
    restrict: 'E',
    scope: {},
    replace: true,
    link: function(scope, element, attrs) {

      var uid = 3

      scope.isAuthenticated = function() {
        console.log(uid)
        return uid !== null
      }

    }
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.4/angular.min.js"></script>

<div ng-app="app">
  <panel></panel>
</div>

私の質問はとてもシンプルで簡潔です。私のconsole.logアプリでは 50 回評価されますが、ここでは 2 回しか評価されません。

何が起こっている?

結びついていないとしても、サイクルに関連していると思います$digest()が、より明確な答えがあればいいでしょう。

4

2 に答える 2

1

link何度も評価されるのは関数ではなく、プロセスが実行されるたびに (基本的にモデルが変更されるたびに)isAuthenticatedチェックされるメソッドです。$digest

ここでhttp://plnkr.co/edit/3mHI2wxELwdF5Th2Pjhk?p=previewを確認できます。変更するたび$scope.yに評価されますisAuthenticated

于 2014-10-08T11:27:22.800 に答える
1

ngIf は、提供された式で $watch 関数を呼び出します。これは、あなたの場合は「isAuthenticated()」です。

この式は、すべての $digest 呼び出しで呼び出されます。参照: https://docs.angularjs.org/api/ng/type/ $rootScope.Scope#$watch

上記のリンクでは、次のことに注意してください。

$digest() を呼び出すたびに watchExpression が呼び出され、監視対象の値を返す必要があります。

だけでなく:

$digest() は変更を検出すると再実行されるため、watchExpression は $digest() ごとに複数回実行でき、べき等である必要があります。

ここでは、ngClick がどのようにダイジェストを呼び出し、ngIf がその式を評価するかを見ることができます http://jsfiddle.net/kihu/bbs8ajnk/2/

この行は、ダイジェスト ループをログに記録します。

$rootScope.$watch(function(){console.log("digest")}, function(){console.log('looped')});
于 2014-10-08T11:32:11.357 に答える