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