Javascript 为什么使用CryptoJS的哈希计算会在Angular中导致$rootScope:infdig错误?

Javascript 为什么使用CryptoJS的哈希计算会在Angular中导致$rootScope:infdig错误?,javascript,angularjs,cryptojs,Javascript,Angularjs,Cryptojs,我有一个简单的页面,当有人在页面中键入字符串时,它会显示字符串的散列。我发现页面有一个JavaScript错误 错误:[$rootScope:infdig]$rootScope/infdig?p0=10&p1=%5B%5B%22sha1…75651%2C1080464653%2C-772792499%5D%2C%5C%22sigBytes%5C%22%3A20%7D%22%5D%5D 该页面的一个非常简化的版本是 <html lang="en"> <head> &

我有一个简单的页面,当有人在页面中键入字符串时,它会显示字符串的散列。我发现页面有一个JavaScript错误

错误:[$rootScope:infdig]$rootScope/infdig?p0=10&p1=%5B%5B%22sha1…75651%2C1080464653%2C-772792499%5D%2C%5C%22sigBytes%5C%22%3A20%7D%22%5D%5D

该页面的一个非常简化的版本是

<html lang="en">
<head>
    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script>
        function MyCtrl($scope) {
            $scope.sha1 = function(pwd) {
                return CryptoJS.SHA1(pwd);
            };
        }
    </script>
</head>
<body>
    <div class="app" ng-app ng-controller="MyCtrl">
        <span ng-bind="sha1('bar')"></span>
    </div>
</body>
</html>

函数MyCtrl($scope){
$scope.sha1=功能(pwd){
返回CryptoJS.SHA1(pwd);
};
}
可作为Plunker提供

我在原始页面中试图做的是在有人输入表单字段时重新计算散列,输入字段定义如下所示

<input id="password" ng-model="password" type="text" placeholder="Password">

ng绑定实际上是
ngbind=“sha1(password)”
,但Plunker中的简单静态案例展示了相同的行为

我推测infdig错误与太多的$digest循环有关,但我不知道这里会发生什么。散列计算似乎触发了错误,因为从sha1函数返回静态字符串不会导致错误。

提供
ng bind=“sha1('bar')”
会使摘要循环不稳定,每次sha1函数返回不同的对象(引用不同)您的摘要循环必须再次运行以稳定它,每个摘要循环都会再次计算ng bind函数表达式,并继续运行,直到达到最大限制集(10)。您也可以通过在scope方法中执行
return[]
来轻松复制此问题。这只是将函数表达式绑定到
ng bind
的不太好的做法的一个副作用,因为它运行每个摘要循环,如果使用它,应该仔细评估

一个简单的解决方案是在密码或任何其他触发器上绑定ng change/ng blur事件,只需将ng bind绑定到属性而不是函数表达式

angular.module('app',[])
.constant('Crypto',window.CryptoJS);
函数MyCtrl($scope,Crypto){
$scope.encrypt=函数(){
$scope.encrypted=Crypto.SHA1($scope.password);
};
}

为什么会给出不同的结果。将ng bind转换为{{sha1('bar')}}插值指令后?