仅将 class 添加到 AngularJS 中的特定 ng-repeat

Only add class to specific ng-repeat in AngularJS

我的应用程序中有一个类似 Facebook 风格的系统,我想在用户点击时让“赞”按钮改变颜色。这是通过添加一个 .active class 来完成的,但我无法弄清楚如何让我的 ng-repeat 中的一个项目具有 thr active class.

这是我的观点:

<div class="list card" ng-repeat="data in array">
  <div>
    <a ng-click="favourite(data.ID)" class="tab-item" >
      <i ng-class="{'active':  favourited}" class="icon ion-thumbsup" ></i>
      Favourite
    </a>
  </div>
</div>

ng-click 将请求发送到服务器存储在数据库中,ng-class 将 class 更改为 active 当 "favourite" 变量来自控制器此请求成功后更改为 true:

$scope.favourite = function(dataID){
    $favourite.favourite(dataID).then(function(data){
      $scope.favourited = true;
    });
  }

这会导致所有最喜欢的按钮都处于活动状态,所以我只是不知道如何只激活当前按钮。

提前致谢

您不能使用全局布尔值来表示数组的特定 元素是最喜欢的元素。

不是在范围中存储布尔值,而是存储最喜欢的元素,并使用active: data == theFavoriteElement

或者,如果可以收藏多个元素,则在元素 本身中存储一个布尔值 ,然后使用 active: data.favorite.

这是因为您正在使用 $scope.favourited,因为对于所有 ng-repeats,此变量只有一个副本,因此它会为所有变量更新。因此,请尝试根据您的要求为单个记录使用一些变量,因为您一次只想将单个记录标记为收藏。

替换

ng-class="{'active': favourited}"ng-class="{'active': data.favourited}"

$scope.favourited = true;data.favourited = true;

只需在每个 data 元素上设置 favorite 属性。一旦您的请求成功完成,请更改您的数据favorite 属性 而不是 $scope 的 属性。

<div class="list card" ng-repeat="data in array">
  <div>
    <a ng-click="favourite(data.ID)" class="tab-item" >
      <i ng-class="{'active':  data.favorited}" class="icon ion-thumbsup" ></i>
      Favourite
   </a>
  </div>
</div>

在你的控制器中:

$scope.favourite = function(dataID){
    $favourite.favourite(dataID).then(function(data){
        data.favourited = true;
    });
}

这应该可以完成工作,但是如果您想要保留最喜欢的数据,则必须将模型与后端的数据绑定。例如,如果标志保存在 data,您应该更改

<div>
  <a ng-click="active = !active" class="tab-item" ng-model="active" >
    <i ng-class="{'active': active}" class="icon ion-thumbsup" ></i>
      Favourite
  </a>
</div>

<div>
  <a ng-click="favorite(data)" class="tab-item">
    <i ng-class="{'active': data.active}" class="icon ion-thumbsup" ></i>
      Favourite
  </a>
</div>

$scope.favorite = function(data) {
    //use $http or $resource to update the data in backend
    //for example if you used $resource service
    data.favorite = !data.favorite;
    data.$save();
};

============

<!DOCTYPE html>
<html ng-app="test">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body ng-controller="testCtrl">
<div class="list card" ng-repeat="data in a">
  <div>
    <a ng-click="active = !active" class="tab-item" ng-model="active" >
      <i ng-class="{'active': active}" class="icon ion-thumbsup" ></i>
      Favourite
    </a>
  </div>
</div>
</body>
</html>