Angular: 使用过滤功能更改 ng-repeat 上的数据

Angular: change data on ng-repeat with filter function

如何使用过滤器函数在 ng-repeat 循环中更改对象的属性值?

我的项目是一个购物车,它根据视图列出产品,我有一个参数 'discount' 可以将产品价格降低 50%,我希望使用过滤器应用更改ng-repeat

我的数据结构是:

[{  
    "categorie": "",
    "name": "",   
    "price": 12
}]

我的 ng-repeat 循环看起来像:

ng-repeat product in products |filter:'priceFilter()

我在控制器中定义的函数是:

var priceFilter = function(product){
    var filtered = [];
    if (discount == true) {
        for (var i = 0; i< product.length; i++) {
            product.price = prix.price /2;
            filtered.push(product);
        }
    }
    return filtered;
}

我错过了什么?现在它过滤掉所有结果,不返回任何内容。

这不是using a custom filter的正确方法 如该示例所示,您需要将此行添加到您的代码中:

angular.module("yourmodulename").filter('priceFilter', function() { return priceFilter; });

并且您还需要将 html 更改为:

<ng-repeat="product in products | priceFilter">

对于这种情况,过滤器不是您想要的,应该使用自定义过滤器来确定某些内容是有效还是无效。并且应该只 return 一个 true 或 false。过滤器要做的就是查看列表中的当前对象,并确定它是否满足特定条件以显示在列表中。

你应该改变你的 html。

<div ng-repeat="product in products">
<div ng-if="discount">
{{product.Price / 2}}
</div>
<div ng-if="!discount">
{{product.Price}}
</div>
</div>

编辑:

如果您想更改数据,那么您不想使用过滤器。在循环显示数据之前,您需要弄清楚。如果您的折扣是一个简单的复选框,您可以向该复选框添加一个 ng-change="adjustprice()" 并让 adjustprice() 进行操作。您不想在 ng-repeat 中触摸 ng-repeat 数据。 angular 不喜欢这样,如果你尝试这样做会破坏东西。

尝试:

Html:

<div ng-repeat="product in products"> 
     <div> 
          {{applyDiscount(product.Price}} 
      </div>
</div>

js

$scope.applyDiscount= function(price){
        if ($scope.discount)
        {
            return price /2;
        }
        return price;}

正如 Camusensei 所说,applyDiscount 函数在每个摘要周期都会 运行,从而减慢应用程序的速度。 对于性能问题,更好的实现方式是使用过滤器,如果输入发生变化,该过滤器仅 运行。

Html:

<div ng-repeat="product in products"> 
     <div> 
          {{product.price | priceFilter:discount}}
      </div>
</div>

Js:

myApp.filter("applyDiscount", function() {
  return function(price, discount) {
    if (discount)
        {
            return price /2;
        }
        return price;
  };
});