fanjavaid
fanjavaid

Reputation: 1738

Add ng-class when Click event triggered in AngularJS

i create simple application. And i add rating feature. I want to change the rating star class when click event is triggered from controller.

In my Controller i check if the rating of object == passed number from view, i return class name active.

After that, i still confused how i pass my return value.

Here is my View

<h3>{{ fruit.title }}</h3>
                <div class="rating">
                    <ul>
                        <li ng-click="addRating(1,fruit)"><i class="glyphicon glyphicon-star-empty"></i></li>
                        <li ng-click="addRating(2,fruit)"><i class="glyphicon glyphicon-star-empty"></i></li>
                        <li ng-click="addRating(3,fruit)"><i class="glyphicon glyphicon-star-empty"></i></li>
                        <li ng-click="addRating(4,fruit)"><i class="glyphicon glyphicon-star-empty"></i></li>
                        <li ng-click="addRating(5,fruit)"><i class="glyphicon glyphicon-star-empty"></i></li>
                    </ul>
                </div>

And here is my Controller :

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

app.controller('fruitController', function($scope) {
    $scope.fruits = [
        {
            title : 'Fresh Red Apple',
            img : 'https://cdn0.iconfinder.com/data/icons/fruits/512/Apple.png',
            description : 'Good for your daily consumption.',
            price : 15000,
            cartQty : 1,
            rating : 0
        },
        {
            title : 'Red Grape',
            img : 'http://www.freepngimg.com/thumb/grape/4-grape-png-image-download-picture-thumb.png',
            description : 'Like a king.',
            price : 34000,
            cartQty : 1,
            rating : 0
        }
    ];

    $scope.total = $scope.fruits.length;

    $scope.addRating = function(number, fruit) {
        fruit.rating = number;
    };

    $scope.ratingClass = function(number) {
        return (number == $scope.rating) ? "active" : "";   
    };
});

You can check my fullcode in https://codepen.io/fanjavaid/pen/MaRWgG

Upvotes: 1

Views: 907

Answers (2)

user3883089
user3883089

Reputation: 86

Replace your rating Div with the below div

    <div class="rating">
       <ul>
           <li ng-click="addRating(1,fruit)"><i class="glyphicon glyphicon-star-empty" ng-class="{active:fruit.rating >= 1}"></i></li>
           <li ng-click="addRating(2,fruit)"><i class="glyphicon glyphicon-star-empty" ng-class="{active:fruit.rating >= 2}"></i></li>
           <li ng-click="addRating(3,fruit)"><i class="glyphicon glyphicon-star-empty" ng-class="{active:fruit.rating >= 3}"></i></li>
           <li ng-click="addRating(4,fruit)"><i class="glyphicon glyphicon-star-empty" ng-class="{active:fruit.rating >= 4}"></i></li>
           <li ng-click="addRating(5,fruit)"><i class="glyphicon glyphicon-star-empty" ng-class="{active:fruit.rating >= 5}"></i></li>
     </ul>

and add .active class in your css.

Upvotes: 1

dfsq
dfsq

Reputation: 193301

Don't duplicate HTML for every star, use ngRepeat with ngClass:

<div class="rating">
    <ul>
        <li class="glyphicon glyphicon-star-empty"
            ng-click="addRating($index + 1, fruit)"
            ng-repeat="star in [0, 1, 2, 3, 4]"
            ng-class="{active: fruit.rating >= $index + 1}"></li>
    </ul>
</div>

Demo: https://codepen.io/anon/pen/RWOPad?editors=101

Upvotes: 4

Related Questions