Angular js - Digest Loop

时间:2016-01-01 02:08:43

标签: angularjs angular-digest

我可能试图清除我在摘要循环上的概念。我有一个小的HTML页面:

<!doctype html>
<html>
    <head lang="en">
        <meta charset="utf-8"/>        
        <title>Practice</title>
    </head>
    <body ng-app="myApp">
        <div ng-controller="myController">
            Enter your text <br>
            <textarea rows="5" id="comments" ng-model="commentText"></textarea>
            <br>
            Type Char:{{ lenghtComment }}            
        </div>        
        <script src="https://code.angularjs.org/1.5.0-beta.2/angular.min.js" type="text/javascript"></script>
        <script src="prac.js" type="text/javascript"></script>
    </body>

</html>   

===================================== 小angualr文件为:

var myApp=angular.module("myApp",[]);
myApp.controller("myController",["$scope",function($scope){
    $scope.commentText="";
   /* $scope.lenghtComment=function(){
        return $scope.commentText.length;
    };*/

 $scope.lengthComment=$scope.commentText.length;

}]);

我想显示我在文本框中输入的字符数。虽然有很多方法可以这样做,但我想知道为什么上面的方法不起作用。范围变量&#34; LenghtComment&#34;取决于&#34; commentText&#34;,因此摘要循环检测&#34; commentText&#34;当用户键入时,应该重复观察者列表,以确保是否有任何因变量发生了变化。在这次运行中,它应该找到&#34; lenghtComment&#34;变量并更新应用程序。但情况并非如此。但是,如果我使用该功能作为评论,它的工作非常好。请指出我的理解中的差距。提前感谢你们。

1 个答案:

答案 0 :(得分:3)

除了你的代码中的拼写错误之外,这不会像现在这样写作。

Angular不会每$digest个周期不断重新运行您的控制器。相反,它会创建监听变量变化的监听器,并更新这些变量。

但是,在这种情况下,$scope.lengthComment不会每$digest个周期更改一次。它可能看起来在变化,但实际上,$scope.commentText.length是一个返回整数的赋值(在本例中为0)。分配完成后,不会重新评估。 lengthComment在这种情况下是一个原语, 依赖于commentText

相比之下,$scope.lengthComment=function() 的另一种形式不断变化。在这种情况下,变量不会分配给函数的返回值,而是函数本身。每$digest,必须重新评估此函数以确定其结果是否相同。