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

在AngularJS重复节中多次调用函数

袁鸿达
2023-03-14
问题内容

我遇到了一个问题,我想绑定到ng-repeat循环内的函数的输出。我发现该函数每个项目被调用两次,而不是我期望的那样。这是ng-
repeat部分(请注意最后的calcRowTotal()调用):

<tr ng-repeat="row in timesheetRows">
    <td>
        <select ng-model="row.categoryID">
            <option ng-repeat="category in categories" value="{{category.id}}">
                {{category.title}}
            </option>
        </select>
    </td>
    <td ng-repeat="day in row.dayValues">
        <input type="text" ng-model="day.hours" />
    </td>
    <td>{{calcRowTotal($index, row)}}</td>
</tr>

calcRowTotal()函数如下所示:

$scope.calcRowTotal = function (index, row) {
    console.log('calcRowTotal - Index: ' + index);
    var total = 0;
    for (var i = 0; i < row.dayValues.length; i++) {
        var num = parseFloat(row.dayValues[i].hours);
        if (isNaN(num)) {
            num = 0;
            //this.dayValues[i].hours = 0;
        }
        total += num;
    }
    //updateDayTotals();
    return total;
}

接下来显示其中一个要迭代的项目的示例:

{
    categoryID: 2,
    dayValues: [
                    { day: $scope.days[0], hours: 5 },
                    { day: $scope.days[1], hours: 0 },
                    { day: $scope.days[2], hours: 3 },
                    { day: $scope.days[3], hours: 0 },
                    { day: $scope.days[4], hours: 2 },
                    { day: $scope.days[5], hours: 5 },
                    { day: $scope.days[6], hours: 8 }
    ]
}

我在控制台中看到以下内容(我正在遍历的集合中当前有两项):

calcRowTotal - Index: 0 
calcRowTotal - Index: 1 
calcRowTotal - Index: 0 
calcRowTotal - Index: 1

我当然可以做一个“
rowTotal”属性,但希望绑定到上面显示的函数提供的“实时”数据。希望重复项是我所缺少的简单东西,因此,我感谢收到关于为什么看到重复项的任何反馈。附带说明一下,由于其中一个文本框中的数据发生了更改,因此我也需要更新行总数,因此可能需要使用其他方法。不过,有兴趣首先了解这种特殊情况。…绝对不希望重复,因为可能存在很多行。

这是一个示例:http :
//jsfiddle.net/dwahlin/Y7XbY/2/


问题答案:

这是因为您在此处绑定到函数表达式:

<td>{{calcRowTotal($index, row)}}</td>

它的作用是在每个项目,每个摘要上重新评估该功能。为防止这种情况,您需要做的是预先计算该值并将其放入数组中。

一种方法是在阵列上设置手表:

$scope.$watch('timesheetRows', function(rows) {
   for(var i = 0; i < value.length; i++) {
     var row = rows[i];
     row.rowTotal = $scope.calcRowTotal(row, i);
   }
}, true);

然后,您要做的就是绑定到该新值:

<td>{{row.rowTotal}}</td>


 类似资料:
  • 问题内容: 我是angular js的新手,目前仍然遇到非常有线的bug。控制器中的函数在按路由加载视图调用时会运行两次。 http://jsfiddle.net/4gwG3/5/ 您将看到两次警报! 我的观点很简单 我的应用程序代码如下 问题答案: 首先检查您是否没有两次初始化Angular应用程序(通过使用 ng-app 自动进行初始化)。 一次,我有2个带有ng-app的html页面(一个用

  • 问题内容: 在我的一个Angular控制器中,我有这个: 在另一个控制器中,我有这个: 现在,这是一个单页应用程序。当我最初进入控制器A并尝试触发此事件时, someAction() 将被执行一次。如果我离开并再次返回到控制器A并执行相同的操作,则 someAction() 将执行两次。如果我再做一次,它会发生3次,依此类推。我在做什么错呢? 问题答案: 你可以尝试使用吗?每次创建控制器A时,它都

  • 我使用下面的代码是为了简化后端请求,但我没有掌握如何调用成功方法或错误方法。 如何达到代码中注释的预期行为? 这是使用上述代码的代码:

  • 问题内容: 如何在Javascript中使用ng-repeat之类 的 ? 例: 我想用ng-repeat重复4次,但是我该怎么做呢? 问题答案: Angular带有limitTo:limit过滤器,它支持限制前x个项目和后x个项目:

  • 问题内容: 我正在使用Ionic,并且想要根据数据动态更改每个项目的背景色。我以为我可以通过函数调用的方式返回正确的类 目前是控制器 在检查控制台时,列表中的每个函数均被调用7次。这是为什么,我应该避免在其中使用函数调用吗? 问题答案: AngularJS可以进行脏检查:它需要在 每个循环中 调用该函数,以确保它不返回新值,并且不需要更新DOM。 这是框架典型过程的一部分,调用像您这样简单的函数不

  • 问题内容: 代码很简单: 您会看到这里有一个函数,我们只在体内调用它一次。但是在控制台中,它打印两次: 您可以在此处观看现场演示:http : //plnkr.co/edit/tb8RpnBJZaJ73V73QISC?p=preview 为什么该函数已被调用两次? 问题答案: 在AngularJS中,用大括号括起来的任何东西都是一个在摘要循环 中至少 被求值 一次 的表达式。 __ Angular