使用带有函数调用的ng-class - 多次调用

drj*_*976 18 angularjs ionic-framework

我正在使用Ionic,并希望根据数据动态更改每个项目的背景颜色<ion-list>.我以为我会通过函数调用来返回正确的类

<ion-list>
  <ion-item ng-repeat="singleCase in allCases" ng-class="getBackgroundColour(singleCase)" class="item-avatar">
    <h2>{{singleCase.date}}</h2>
    <p>{{singleCase.caseType}}</p>
  </ion-item>
</ion-list>
Run Code Online (Sandbox Code Playgroud)

这是目前的控制器

  .controller('AllCasesCtrl', ['$scope', '$log', 'dummyData', function($scope, $log, dummyData) {
    $scope.allCases = dummyData.cases;

    $scope.getBackgroundColour = function(singleCase){

      $log.log("getBackgroundColour called...singleCase type: " + singleCase.speciality);

      var colourMap = {
        speciality1: "speciality1Class",
        speciality2: "speciality2Class",
        speciality3: "speciality3Class"
      };

      return colourMap[singleCase.speciality];
    };

  }])
Run Code Online (Sandbox Code Playgroud)

在检查控制台时,列表中的getBackgroundColour()每个函数被调用7次<ion-item>.为什么这样,我应该避免使用函数调用ng-class吗?

Bla*_*ole 26

AngularJS使用脏检查:它需要在每个周期调用该函数以确保它不返回新值并且不需要更新DOM.

它是框架典型过程的一部分,调用像您这样简单的函数不应该对性能产生任何负面影响.代码的可读性和可测试性在这里更为重要,因此请保持控制器中的逻辑.

但是,一个简单的事情colourMap就是在函数之外移动声明,这是一个常量:

var colourMap = {
    speciality1: "speciality1Class",
    speciality2: "speciality2Class",
    speciality3: "speciality3Class",
};

$scope.getBackgroundColour = function(singleCase) {
  return colourMap[singleCase.speciality];
};
Run Code Online (Sandbox Code Playgroud)

  • @Alex你的微积分中的第二个"100"来自哪里?如果你知道它们不会改变,那么你只能评估你的表达式(这是[懒惰的一次性绑定](http://stackoverflow.com/q/23969926/2057033)),但你不能"绕过"脏检查系统.如果没有它,你怎么知道你的价值观发生了变化? (2认同)

Jas*_*son 8

只要您的列表不是很大,您的方式就可以了.如果您使用的是角度1.3并希望降低调用次数,则可以将ng-class更改为ng-class =":: getBackgroundColour(singleCase)".这适用于一次时间绑定,因此一旦值稳定,它将不再检查.这很可能意味着每个项目有两个电话.