每次重复ng-repeat后更新变量

时间:2016-08-22 07:29:33

标签: javascript angularjs

好的,首先我想说的是我刚刚开始使用角度,所以这可能是一个非常微不足道的问题。

我们说我有js文件:

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


function MyCtrl($scope) {
        $scope.pool=10;
        $scope.array=[1,3,5]

}

和ng-repeat

<div ng-controller="MyCtrl">
  <div ng-repeat="x in array" ng-init="pool=pool-x">
      {{pool}}
  </div>
</div>

在此示例中,变量pool在每次迭代开始时等于10,我希望它更新,因此结果可能是9,6,1而不是9,7,5。如何实现

2 个答案:

答案 0 :(得分:4)

这是一个已知的角度陷阱,问题是角度使用称为scope inheritance的东西,这意味着ng-repeat的每个角色都会创建一个带有属性pool的新范围。

并且更改该属性的值只会影响内部范围,因为它是一个不同的变量。

相反,您应该将引用用于非原始值(例如Object):

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


function MyCtrl($scope) {
  $scope.obj = { pool: 10 };
  $scope.pool = 10;
  $scope.array = [1,3,5];
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MyCtrl">
  <div ng-repeat="x in array" ng-init="pool=pool-x;obj.pool=obj.pool-x;newvar=obj.pool">
      {{pool}} *** {{newvar}}
  </div>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

ng-init只会被调用一次,它是一个初始化指令,所以你可以试试这个,我没有测试但是应该可以工作:

// In you controller
$scope.changePool = function(val) {
    $scope.pool -= val;
}
<div ng-repeat="x in array; changePool(x)">
   {{pool}}
</div>

<!-- or this -->
<div ng-repeat="x in array">
   {{changePool(x)}}
</div>