2016-10-01 75 views
1

運行連接到角控制器只有一次的功能我連着功能範圍,我想以具有約束力的運行它,就像這樣:如何在結合

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 
    var count = 0; 

    $scope.f = function() { 
     count++; 
     return count; 
    } 
} 

HTML ...

<div ng-controller="MyCtrl"> 
    {{f()}} 
</div> 

但是當我運行它時,該函數返回11,你可以在這個小提琴檢查:http://jsfiddle.net/h4w4yc6L/

好像功能是運行好幾次,雖然我只把它稱爲一次Ø n的HTML,因爲我的控制檯抱怨

angular.js:13920 
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! 

請注意,我真的是新手在角!我不知道爲什麼發生這種情況,所以我會,如果你向我提供關於爲什麼出現這種情況,如何避免這種情況,什麼是實現這一目標的正確方法的信息真的很高興......在

感謝通過結合一個模型來查看通過一個範圍推進:)

回答

4

角的作品。每隔一段時間,它都會在範圍上運行摘要循環以更新相關視圖。在摘要循環期間,由於摘要循環如果認爲需要(如果值不是「穩定的」),它會重複多次(至少一次),並且可能多次重新評估該範圍內的所有綁定。我建議閱讀https://docs.angularjs.org/guide/scope,特別是範圍生命週期的章節。由於您直接綁定到函數表達式{{f()}}(請參閱https://docs.angularjs.org/guide/expression),Angular會在每次重新評估綁定時調用函數。使用插值語法{{}}以及改變控制器或模型狀態的函數是不推薦的,因爲您不控制它們被評估的頻率

我應該首先注意,如果您希望函數只重新評估一些用戶輸入(例如單擊),使用適當的綁定(ng-click)等。

如果您確實希望該函數僅被評估一次,您可能需要在控制器的構造函數中評估它並存儲結果值。例如,

function MyCtrl($scope) { 
    var count = 0; 

    $scope.f = function() { 
     count++; 
     return count; 
    } 

    $scope.g = f(); 
} 

<div ng-controller="MyCtrl"> 
    {{g}} 
</div> 

或者你可以使用ng-init(見https://docs.angularjs.org/api/ng/directive/ngInit,並注意頂部的警告)

所以,用ng-init,你可能會得到

<div ng-controller="MyCtrl" ng-init="foo = f()"> 
    {{foo}} 
</div> 

這並不是雖然推薦模式。

另一種選擇是使用的一次性綁定(見https://docs.angularjs.org/guide/expression的標題爲一次性綁定

所以,你可以不喜歡

<div ng-controller="MyCtrl"> 
    {{::f()}} 
</div> 
+1

它應該是一次性的結合不是單向綁定.. –

+0

@RaviTeja尼斯漁獲 - 謝謝 – Daniel