AngularJS - 链接Fn在指令中被多次评估

时间:2014-10-08 08:53:12

标签: javascript angularjs angular-directive

'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()周期相关,如果没有联系,但更明确的答案会很好。

2 个答案:

答案 0 :(得分:1)

这不是多次评估的link函数,每次isAuthenticated进程检查的$digest方法都是$scope.y运行(基本上随时改变模型)。

您可以在http://plnkr.co/edit/3mHI2wxELwdF5Th2Pjhk?p=preview看到每次isAuthenticated更改后评估{{1}}

答案 1 :(得分:1)

ngIf在提供的表达式上调用$ watch函数,该函数是&#34; isAuthenticated()&#34;在你的情况下。

每个$ digest调用都会调用此表达式。看到: https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$表

在上述链接中,请注意:

  

每次调用$ digest()时都会调用watchExpression   返回将要监视的值。

但是:

  

由于$ digest()在检测到更改时重新运行,因此watchExpression可以每$ digest()执行多次,并且应该是幂等的

在这里,您可以观看ngClick如何调用摘要,从而导致ngIf评估它的表达式 http://jsfiddle.net/kihu/bbs8ajnk/2/

此行记录摘要循环:

$rootScope.$watch(function(){console.log("digest")}, function(){console.log('looped')});