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 回答