<!DOCTYPE html>
<html>
<head>
<title>AngularJs Star Rating Demo</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.css" />
<link rel="stylesheet" href="style.css">
<script src="https://code.angularjs.org/1.3.0-rc.2/angular.js"></script>
<script src="app.js"></script>
</head>
<body ng-app="starApp">
<div class="col-md-12">
<div class="row">
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<a class="navbar-brand" href="#">Star Rating AngularJs Snippet</a>
</div>
</div><!-- /.container-fluid -->
</nav>
</div>
</div>
<div ng-controller="StarCtrl">
<div class=col-md-12>
<div ng-repeat="rating in ratings">
<h2>{{rating.current}} /
{{rating.max}}</h2>
<div star-rating rating-value="rating.current" max="rating.max" on-rating-selected="getSelectedRating(rating)"></div>
</div>
</div>
<div class="col-md-12 clear">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default" data-ng-click="setMinrate()">Min Rate</button>
<button type="button" class="btn btn-default" data-ng-click="setMaxrate()">Max Rate</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn btn-primary" data-ng-click="sendRate()">Send</button>
</div>
</div>
</div>
</div>
</body>
</html>
var starApp = angular.module('starApp', []);
starApp.controller('StarCtrl', ['$scope', function ($scope) {
$scope.rating = 0;
$scope.ratings = [{
current: 5,
max: 10
}, {
current: 3,
max: 5
}];
$scope.getSelectedRating = function (rating) {
console.log(rating);
}
$scope.setMinrate= function(){
$scope.ratings = [{
current: 1,
max: 10
}, {
current: 1,
max: 5
}];
}
$scope.setMaxrate= function(){
$scope.ratings = [{
current: 10,
max: 10
}, {
current: 5,
max: 5
}];
}
$scope.sendRate = function(){
alert("Thanks for your rates!\n\nFirst Rate: " + $scope.ratings[0].current+"/"+$scope.ratings[0].max
+"\n"+"Second rate: "+ $scope.ratings[1].current+"/"+$scope.ratings[0].max)
}
}]);
starApp.directive('starRating', function () {
return {
restrict: 'A',
template: '<ul class="rating">' +
'<li ng-repeat="star in stars" ng-class="star" ng-click="toggle($index)">' +
'\u2605' +
'</li>' +
'</ul>',
scope: {
ratingValue: '=',
max: '=',
onRatingSelected: '&'
},
link: function (scope, elem, attrs) {
var updateStars = function () {
scope.stars = [];
for (var i = 0; i < scope.max; i++) {
scope.stars.push({
filled: i < scope.ratingValue
});
}
};
scope.toggle = function (index) {
scope.ratingValue = index + 1;
scope.onRatingSelected({
rating: index + 1
});
};
scope.$watch('ratingValue', function (oldVal, newVal) {
if (newVal) {
updateStars();
}
});
}
}
});
.rating {
color: #a9a9a9;
margin: 0;
padding: 0;
}
ul.rating {
display: inline-block;
}
.rating li {
list-style-type: none;
display: inline-block;
padding: 1px;
text-align: center;
font-weight: bold;
cursor: pointer;
font-size:20px;
}
.rating .filled {
color: orangered;
}
.clear{
margin-top:20px;
}
#AngularJs Star Rate Directive
Author: Giuseppe Pace
Follow me [@giuseppepace89]([https://twitter.com/giuseppepace89)