【问题标题】:AngularJS: function call with ng-classAngularJS:使用 ng-class 调用函数
【发布时间】:2016-04-08 15:16:00
【问题描述】:

我从 ng 类调用一个函数,因为我想根据价格动态返回类名。

我有 6 个数据和函数假设调用 6 次,但是当我运行代码时,我看到它调用了 12 次.....任何人都可以看到代码并告诉我为什么函数被调用 12 次6 个。

<div ng-app="myApp">
  <ul ng-controller="MyController">
    <li ng-class="setColor(item.price)" ng-repeat="item in products">{{item.name}} &mdash; {{item.price}}</li>
  </ul>
</div>


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

myApp.controller('MyController', function MyController($scope) {

$scope.setColor = function(price) {

     alert(price);
}   

  $scope.products = [
    {
        'name' : 'Xbox',
        'clearance' : true,
        'price' : 30.99,
    },
    {
        'name' : 'Xbox 360',
        'clearance' : false,
        'salesStatus' : 'old',
        'price' : 99.99,
    },
    {
        'name' : 'Xbox One',
        'salesStatus' : 'new',
        'price' : 50,
    },
    {
        'name' : 'PS2',
        'clearance' : true,
        'price' : 79.99,
    },
    {
        'name' : 'PS3',
        'salesStatus' : 'old',
        'price' : 99.99,
    },
    {
        'name' : 'PS4',
        'salesStatus' : 'new',
        'price' : 20.99,
    }
    ]
})

这里是 jsfiddle https://jsfiddle.net/tridip/ob8jh2o7/1/

更新:我的目标

如果价格低于 50,则商品颜色应为红色。如果价格超过 50,则项目颜色应为黄色,如果价格超过 (50+(50*60/100)),则项目颜色应为绿色。现在告诉我如何用更少的迭代来实现它。指导我以最佳方法完成它。

谢谢

如果修复它。这是我的新小提琴链接https://jsfiddle.net/tridip/ob8jh2o7/22/

【问题讨论】:

  • 这就是 Angular 的工作原理。它将在每个摘要循环中执行并继续执行它,直到它检测到没有变化。这意味着每行至少两次,每个摘要循环每行最多 10 次。问题是什么? 12 次迭代不算什么。如果您有数千(甚至数百)行这样的行,ng-repeat 是出了名的慢,您应该考虑一次性绑定它们,但它们永远不会被更新。你的 json 不能改变或者它不会被反映...blog.thoughtram.io/angularjs/2014/10/14/…

标签: angularjs


【解决方案1】:

基于Using ng-class with a function call - called multiple times

如果你只是修改类,你可以尝试这样的事情:

var colourMap = {
    "30.99": "speciality1Class",
    "99.99": "speciality2Class",
    "50": "speciality3Class",
    "79.99": "speciality4Class",
    "20.99": "speciality5Class"
};


$scope.setColor = function(price) {
    return colourMap[price];
}   

小提琴:https://jsfiddle.net/ob8jh2o7/11/

但是,如果您使用警报或日志,它将一直被调用,因为角度使用脏检查。但是,如果您尝试触发警报,我不会使用ng-class。您可以在此处阅读有关 angulars 脏检查的更多信息 - https://docs.angularjs.org/guide/scope#scope-life-cycle。

【讨论】:

  • 我检查了你的 js fiddle 并发出警报和通知迭代发生 12 次而不是 6 ......但不明白原因。
  • 查看我的更新和我的目标区域并做出相应的回答。
  • @Mou 如果您将警报放在 ng-class 评估中,它会因为脏检查而触发 2 次,我建议您阅读链接的帖子以了解有关脏检查的更多详细信息感兴趣。至于你更新的目标,你可以做一些 if/else。
  • 再一次,如果您需要对重复中的每个项目执行一个函数不要在 ng-class 中评估它,请使用 ng-init 或其他东西。
  • 如果我使用 ng-init,我们无法设置 css 类。我不确定是否可以通过 ng-init 实现我的目标。你能告诉我如何使用动态设置类的 ng-init 来实现我的目标吗?
【解决方案2】:

Angularjs 使用dirty-check 方法,因此它需要调用所有过滤器以查看是否存在任何更改。在此之后,它检测到一个变量(您键入的变量)发生了变化,然后再次执行所有过滤器以检测是否有其他变化。

第一个调用来自正在检测更改的观察者。因为有一个,所以需要再次调用它们以查看是否有新闻更改,因为观察者可以进行更改。

【讨论】:

  • 在我的代码中,当 ng-repeat 将执行时,控制将在循环中迭代多少时间。如果数组中有 6 个数据,则 ng-repeat 应重复 6 次。从您的解释中不清楚什么是脏检查,以及为什么脏检查迭代将发生两次意味着 12 次而不是 6 次?帮助我理解这一点。
  • 查看我的更新和我的目标区域并做出相应的回答。
【解决方案3】:
   <li ng-class="{red : item.price <= 50 , yellow: item.price >  50 && item.price <= 50 + 50*0.6, green: item.price > 50 + 50*0.6}" ng-repeat="item in products track by $index">{{item.name}} &mdash; {{item.price}}</li>

编辑小提琴工作:https://jsfiddle.net/ob8jh2o7/21/

【讨论】:

  • 这不会给用户返回一个css类。
  • 查看我的更新和我的目标区域并做出相应的回答。
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 2019-11-12
  • 2014-07-06
  • 2023-03-23
  • 2013-03-02
  • 2015-11-27
  • 1970-01-01
  • 2017-08-05
相关资源
最近更新 更多