1

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

2 Answers 2

4

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

Sign up to request clarification or add additional context in comments.

2 Comments

:D yes, thank you for your advice. But i still don't understand in this line {active: fruit.rating >= $index + 1}. Please explain that line to me ^^.
This is usual ngClass syntax. Means, set class "active" when fruit.rating >= $index + 1 condition is met. $index is what ngRepeat sets on each iteration.
1

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.