当前位置: 首页 > 面试题库 >

AngularJS 1.2中的random orderBy返回'infdig'错误

李奕
2023-03-14
问题内容

orderBy在这个问题中使用随机排序技术在AngularJS1.1中工作正常。

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

function MyCtrl($scope) {
    $scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
    $scope.random = function() {
        return 0.5 - Math.random();
    }
}
不过,在1.2版中,它将 infdig错误放入控制台,并需要更长的时间返回排序后的结果: http
//jsfiddle.net/mblase75/jVs27/

控制台中的错误如下所示:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: $watchCollectionWatch; newVal: 42; oldVal: 36"],["fn: $watchCollectionWatch; newVal: 47; oldVal: 42"],["fn: $watchCollectionWatch; newVal: 54; oldVal: 47"],["fn: $watchCollectionWatch; newVal: 61; oldVal: 54"],["fn: $watchCollectionWatch; newVal: 68; oldVal: 61"]]

文档orderBy没有使用函数表达式的示例,仅使用字符串表达式。有什么变化,还是这是一个错误?


问题答案:

我不确定以前的版本,但是在当前版本中,在作用域上监视的任何表达式(例如传递给的表达式ng-repeat)通常每个摘要至少评估两次。仅当两次连续求值之间在整个Angular应用程序的所有范围内所有求值表达式的结果相同时,摘要循环才结束。

因为每次评价

<li ng-repeat="i in list | orderBy:random">{{i}}</li>

导致对random()的调用,并且顺序不同,然后Angular将继续评估表达式,直到达到10次摘要迭代的极限并引发错误。

解决方案是在控制器中的模板外部设置顺序:

$scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
$scope.rankedList = [];
angular.forEach($scope.list, function(item) {
    $scope.rankedList.push({
        item: item,
        rank: 0.5 - $window.Math.random()
    });
});

然后通过类似以下命令使用该字段:

<li ng-repeat="i in rankedList | orderBy:'rank'">{{i.item}}</li>

这可以在jsfiddle中看到。



 类似资料:
  • 基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par

  • 我的Kotlin Android应用程序有问题。到目前为止我还没有用Kotlin写过这么大的项目,所以我完全不知道出了什么问题。 当我试图启动我的应用程序时,我重新设置了一堵红线墙。我找到了一些解决方案(针对Java)并试图将它们实现到我的代码中,但没有奏效。 [FIXED]我修复了我的错误(在第一个注释中指出),并从片段xml中删除工具:context=“.mainactivity”

  • 我有一个在服务器端使用spring boot的系统。我得到了一个错误,我看不到这里发生了什么。 那是我的控制器,其终点如下: 方法compute age返回(显然)人的年龄。问题是:当我使用postman到这条路由时,该方法运行,但我得到一个http错误405。 我已经做了一些关于它的搜索,我没有找到任何解决方案,虽然它看起来很简单。 我真的很感谢任何帮助

  • 我使用的是Android Studio,当我将添加到我的Gradle文件中时,我得到了很多错误: 所有这些似乎都表现在: 而且

  • 我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?

  • 我有一个电子表格,由外部应用程序通过Google Sheets API编辑。然后,我在电子表格中有一个谷歌应用程序脚本函数,它由可安装的更改触发器调用。在开始时,此函数检查changeType是否等于“EDIT”,然后使用getActiveRange()检查编辑范围的最后一列。这很好,但有时返回的范围比实际编辑的范围小。功能代码: 例如,我们有一个空范围A3: G5。在这个范围内插入值后,它会正确