2

我可能会试图澄清我对摘要循环的概念。我有一个小的 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>   

====================================== 小角度文件为:

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;

}]);

我想显示我在文本框中键入的字符数。尽管有很多方法可以做到这一点,但我想知道为什么上述方法不起作用。范围变量“LenghtComment”依赖于“commentText”,因此摘要循环在用户输入时检测到“commentText”上的更改,然后应在观察者列表中重复以确保是否有任何因变量已更改。在这次运行中,它应该找到“lenghtComment”变量的变化并更新应用程序。但事实并非如此。但是,如果我按照评论使用该功能,它的效果非常好。请指出我理解的差距。提前谢谢各位。

4

1 回答 1

3

除了代码中的错字之外,这将无法按照现在的编写方式工作。

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

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

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

于 2016-01-01T02:21:38.563 回答