angular .module('demo', []) .controller('DefaultController', DefaultController) .controller('StarController', StarController) .directive('star', star); function DefaultController() { var vm = this; vm.products = [{ product: "chicken", rating: 3 }, { product: "fish", rating: 4 }, { product: "pizza", rating: 5 }]; } function star() { var directive = { restrict: 'E', scope: { rating: '=', max: '=' }, link: linkFunc, controller: StarController, controllerAs: 'star', bindToController: true }; return directive; function linkFunc(scope, element, attrs, ngModelCtrl) { for (var i = 0; i < scope.max; i++) { var fillStyle = ''; if (i < scope.rating) { fillStyle = 'fill'; } else { fillStyle = 'empty'; } element.append('<span class="star-icon ' + fillStyle + '">☆</span>'); } } } function StarController() { var vm = this; }
ul { font-size: 20px; list-style-type: none; padding: 0; } ul li { padding: 10px; } ul li > span { display: inline-block; width: 100px; } star span { margin: 0px 5px; } .star-icon { color: #ddd; font-size: 1.5em; position: relative; top: 3px; } .star-icon.fill:before { text-shadow: 0 0 1px rgba(0, 0, 0, 0.7); color: #FDE16D; content: '\2605'; position: absolute; left: 0; } .star-icon.empty:before { text-shadow: 0 0 1px rgba(0, 0, 0, 0.7); color: #FFF; content: '\2605'; position: absolute; left: 0; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="demo"> <div ng-controller="DefaultController as ctrl"> <ul> <li ng-repeat="product in ctrl.products"> <span ng-bind="product.product"></span> <star rating="product.rating" max="5"></star> </li> </ul> </div> </div>