2014-10-08 28 views
1

AngularJS - 聯FN多次被評爲在指令

'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()週期有關(如果不是並列的話),但更有啓發性的答案會很好。

回答

1

ngIf呼籲提供表達$手錶的功能,這就是「isAuthenticated()」你的情況。

這個表達式將在每個$ digest調用中調用。見: https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$手錶

在上面的鏈接,請注意:

的watchExpression被稱爲在每次調用$消化(),並應 返回的值將是觀看。

但也:

因爲$摘要(),當它檢測到改變watchExpression可以每$摘要多次執行(),並應冪等重播

在這裏,您可以觀看ngClick如何調用導致ng評估其表達式的摘要 http://jsfiddle.net/kihu/bbs8ajnk/2/

此行記錄摘要循環:

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

事實上,它被每個與「$ scope」視圖「鏈接」的項目觸發。知道了謝謝 – domokun 2014-10-08 15:16:53