2016-02-12 60 views
1

在我們當前的Angular應用程序中,我發現了一個奇怪的行爲。例如:角度始終運行檢查

angular.module('app.book') 
    .directive('ddBook', function() { 
     return { 
      scope: {}, 
      replace: true, 
      controller: 'BookCtrl', 
      controllerAs: 'ctrl' 
     }; 
    }) 
    .controller('BookCtrl', 
     [ 
      '$scope', 
      function ($scope) { 


       $scope.isPrebookingAllowed = function() { 
        //if I set here break point it will always be hited 
        return true; 
       }; 

      } 
     ]); 

這個指令

<div ng-show="isPrebookingAllowed()"> 
    //something goes here 
</div> 

的問題是,如果我將打破isPrebookingAllowed方法點,它會永遠打它的一些HTML。這是接縫,我有無限循環,並且觸發了這個指令摘要循環,但是我沒有對UI進行任何更改。

+0

如果您沒有對UI進行任何更改(無意或其他方式),並且您沒有在其他地方調用isPrebookingAllowed,那麼您將沒有問題。既然你做了,isPrebookingAllowed的內容是相關的,你的問題不能被解決沒有看到你如何寫它。 – Neil

+0

也只是爲了說明一個觀察者註冊到'isPrebookingAllowed'感謝'ngShow'。這意味着,在整個應用程序中運行摘要循環時,角度將通常檢查其所有註冊的觀察者以更新任何數據綁定。由於'isPrebookingAllowed'是一個函數,它意味着它將被執行。我說通常是因爲角可能會優化性能,但它確實意味着'isPrebookingAllowed'可以在您沒有做任何指令時直接調用它。至少這是我對消化週期的理解。 – ste2425

+0

'isPrebookingAllowed'函數在每個摘要循環中得到調用.. t;擔心它..它的角度正常 –

回答

1

Angular會在每個摘要循環中更新DOM。它可以通過監視特定項目的變化來優化這一點。所以,如果你這樣做:

<div ng-show="ctrl.isPrebookingAllowed"> 
    //something goes here 
</div> 

它只會檢查ctrl.isPreBookingAllowed的價值變化,如果沒有變化沒有任何反應。

不過,如果你調用一個函數角度看不出來的結果是否可能已經改變,所以它每次都會把它叫做:

<div ng-show="ctrl.isPrebookingAllowed()"> 
    //something goes here 
</div> 

如果代碼短了大量的呼叫可能無所謂的。否則,請嘗試在範圍內或控制器上設置代碼集值(如果您使用'controller as'),尤其是如果表達式在重複內部,並且最終會出現大量代碼集。

我認爲在這種情況下,您未發佈的其他代碼可能會觸發digest循環。再次解決這個問題的方法是僅在可能更改結果並將結果存儲在範圍內時評估表達式。