增加AngularJS模板中的变量

时间:2012-10-19 21:24:48

标签: javascript angularjs

我会先说这是我对AngularJS的新手,所以请原谅我,如果我的心态远远不够。我正在使用AngularJS编写一个非常简单的单页报告应用程序,肉和土豆当然使用角度模板系统自己生成报告。我有许多报告,我正在从类似Jinja的语法转换,我很难复制任何类型的计数器或运行制表功能。

实施例

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}

在我的控制器中,我定义了一个像$scope.total = 0;这样的变量,然后我可以在模板内部访问而没有问题。我无法弄清楚的是如何从total元素中增加ng-repeat。我想这会看起来像 -

<ul>
    <li ng-repeat="foo in bar">
        {{ foo.baz }} - {{ total = total + foo.baz }}
    </li>
</ul>
<div> {{ total }} </div>

这显然不起作用,也不像{{ total + foo.baz}}那样,提前感谢任何建议。

3 个答案:

答案 0 :(得分:33)

如果您想要的只是计数器(根据您的第一个代码示例),请查看包含ngRepeat中当前(基于0)索引的$ index。然后只显示总数的数组长度。

<ul>
    <li ng-repeat="item in items">
        Item number: {{$index + 1}}
    </li>
</ul>
<div>{{items.length}} Items</div>

如果您想在重复的商品中使用特定字段的总数,比如价格,您可以使用过滤器执行此操作,如下所示。

<ul>
    <li ng-repeat="item in items">
        Price: {{item.price}}
    </li>
</ul>
<div>Total Price: {{items | totalPrice}}</div>

过滤功能:

app.filter("totalPrice", function() {
  return function(items) {
    var total = 0, i = 0;
    for (i = 0; i < items.length; i++) total += items[i].price;
    return total;
  }
});

或者,对于改进的可重用性,通用总计过滤器功能:

  app.filter("total", function() {
    return function(items, field) {
      var total = 0, i = 0;
      for (i = 0; i < items.length; i++) total += items[i][field];
      return total;
    }
  });

将使用如下:

<div>Total price: {{items | total:'price'}}</div>

答案 1 :(得分:5)

我需要总计而不是平均总数,所以我添加了@TimStewart留下的内容。代码如下:

app.filter("runningTotal", function () {
    return function(items, field, index) {
        var total = 0, i = 0;
        for (i = 0; i < index+1; i++) {
            total += items[i][field];
        }
        return total;
    };
});

要在列中使用它,您只需:

<div>Total price: {{items | runningTotal:'price':$index}}</div>

答案 2 :(得分:0)

我不确定我是否完全理解这个问题,但只是需要显示您正在迭代的对象中的总数?只需将$scope.total设置为数组的长度(上例中为bar)。所以,$scope.total = $scope.bar.length;

如果您想要所有foo.baz属性的总和,您只需要在控制器中计算它。

$scope.total = 0;
angular.forEach($scope.bar, function(foo) {
    $scope.total += foo.baz;
});