javascript - angularjs - 动态函数返回

标签 javascript angularjs infinite-loop

index.html

<div ng-repeat="object in objects" ng-style="getStyle(object.id)"></div>

Controller .js

[...]

$scope.startWidth = 100;

$scope.getObject = [...]

$scope.getStyle = function(id) {
   var widthVal = $scope.startWidth;
   $scope.StartWidth += $scope.getObject(id).value;
   return { width : widthVal }
}

[...]

此代码运行到无限 $digest 循环。我想我知道为什么。返回值不应该是动态的。但如果没有循环我怎样才能实现这一点呢?我想显示不同宽度的对象。对象的宽度取决于前一个对象的值。

最佳答案

问题在于 ng-style 在每个子作用域上放置一个 $watchExpression

$watchExpression 必须幂等,这意味着它必须通过多次检查返回相同的结果。
如果$watchExpression仍然脏,另一个$digest将会被触发。

更新

在看到GRaAL不错的答案后,我想出了更好的解决方案:

这是一个演示插件:http://plnkr.co/edit/oPrTiwTOyCR3khs2iVga?p=preview

Controller :

$scope.$watchCollection('objects', function calculateWidths() {
  var tempWidth = 0;
  for( var i = 0; i < $scope.objects.length; i++) {
    tempWidth += $scope.objects[i].value;
    $scope.objects[i].width = tempWidth + 'px';
  }
});

标记:

<div ng-repeat="object in objects" ng-style="{width: object.width}">

旧解决方案

这是一个骗子:http://plnkr.co/edit/CqxOmV5lpZSLKxqT4yqo?p=preview

关于javascript - angularjs - 动态函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387225/

相关文章:

c++ - 带间隔的最佳无限 C++ while 循环

javascript - 脚本函数不会打开模态

c# - 如何在不挂起程序的情况下运行无限循环? (C#)

javascript - jquery 圈子进度 |更改圆圈进度的颜色

angularjs bootstrap popover数据绑定(bind)不起作用

javascript - 从父 Controller 调用 $mdDialog 内的函数

javascript - 在多个 Controller 中使用 AngularJs 服务

javascript - 鼠标移动后无限循环

javascript - Couchdb 使用用户名和密码同步访问

javascript - 使用占位符时禁用 Chrome 自动填充