对ng-repeat项目执行简单算术并更新控制器

时间:2015-01-12 23:39:18

标签: angularjs angularjs-scope angularjs-ng-repeat

我是棱角分明的新人,非常感谢你的帮助 我需要以下方面的帮助: 1.我有以下代码

<tr ng-repeat="user in page ">
                <td class="tdContactsCentered">{{user.name}}<input type="hidden" name="cid" value="{{user.id}}" /></td>
                <td class="tdContactsCentered" >{{user.accountNumber}}</td>
                <td class="tdContactsCentered">{{user.serialNumber}}</td>
                <td class="tdContactsCentered"><input type="text" ng-model="sdate" class="input-small" /> </td>
                <td class="tdContactsCentered"><div class="input-append">
                    <input type="text"  ng-model="ads.value"  class="input-small" />
                </div></td>
                 <td class="tdContactsCentered"><div class="input-append">
                    <input type="text"
                           ng-model ="ads.multipliedByIt"
                           class="input-small"
                           name="expected"
                          />
                </div></td>

我从我的控制器中设置了sdate值并且它很好

下面是我的角度代码。

   $scope.ads = {
        value:0,
        multipliedByIt:0
};

var multipliedByIt = function() {
    $scope.ads.multipliedByIt = $scope.ads.value * $scope.sdate;
}


    $scope.$watch('ads.value',multipliedByIt );

问题是,ads.value和ads.multipliedByIt绑定并为表格中的所有单元格/行设置相同的值,但我想为ads.value设置不同的单独值。

我不确定这个问题的格式是否合适,我希望它足够清楚。

谢谢

3 个答案:

答案 0 :(得分:0)

https://github.com/angular/angular.js/wiki/Understanding-Scopes

使用ng-repeat时使用$scope.$parent修改子范围之外的值。

答案 1 :(得分:0)

试试这个:

$scope.ads = {
    value:0,
    multipliedByItself:0
};

var multipliedByIt = function(newValue, oldValue) {
    $scope.ads.multipliedByIt = newValue * $scope.sdate;
}

$scope.$watch('ads.value', multipliedByIt );

答案 2 :(得分:0)

听起来你想要做的就是这样:

http://codepen.io/robertmesserle/pen/16d97c19d97eb2acf339569565e5dd11?editors=001

我建议您不要依赖Angular为每个用户创建数据的本地副本,而是建议您自己动手:

$scope.$watch('page', function (newValue, oldValue) {
  angular.forEach(newValue, function (user) {
    if (!user.ads)   user.ads = angular.extend({}, $scope.ads);
    if (!user.sdate) user.sdate = $scope.sdate;
    user.ads.multipliedByIt = user.ads.value * user.sdate;
  });
}, true);

这做了一些事情:

  1. 如果您的用户对象上没有ads个对象,则会根据$scope.ads
  2. 添加一个
  3. 如果您的用户对象上没有sdate个对象,则会从$scope
  4. 复制其值
  5. 它完成了你的老观察员的工作
  6. 最后一部分是有效的,因为我将true传递给了$watch方法,告诉它对更改进行深入检查,这会像以前的观察者那样捕获user.ads.value的更改。

    我希望这会有所帮助。


    修改:根据您的后续问题添加此内容。这应该可以解决您的问题:

    $scope.zoneConfig = function (accountForm) {
      $scope.lastAction = 'create';
      $scope.uri = "/phoenix/protected/users/conf/";
      var uri = $scope.uri;
      angular.forEach($scope.page, function (user, key) {
        var xsrfi = $.param({
          'monthlyContributable' : user.ads.value,
          'expectedAmount': user.ads.multipliedByIt
        });
      });
    };
    

    失败的原因是没有$scope.user - $scope.page包含一系列用户。由于您正在迭代$scope.page,我将value更改为user以使其更加清晰,然后直接引用它。