angularjs - 为angularjs中的评论创建十进制星级

标签 angularjs angularjs-directive

这是一个在 angularjs 中显示星级代码的代码。在某些时候,我需要对整个系统的所有评分进行平均,所以我将得到 2.4 而不是 rate:2 。在这种情况下,我很乐意展示 2 颗星,它们是完全填充的,而一颗只有一半填充的。如何更改我的代码以添加此功能? 此外,最初我不想指定任何填充的星号。这也需要修改,我不知道应该怎么做?

<div ng-app="app" ng-controller="RatingCtrl" class="container">
  <h1>Angular Star Rating Directive</h1>
  <div star-rating ng-model="rating1" max="10" on-rating-selected="rateFunction(rating)"></div>
  <star-rating ng-model="rating2" readonly="isReadonly"></star-rating>
  <label>
    <input type="checkbox" ng-model="isReadonly" /> Is Readonly
  </label>

  <div><strong>Rating 1:</strong> {{rating1}}</div>
  <div><strong>Rating 2:</strong> {{rating2}}</div>
</div>

在我的指令中

angular.module("app", [])
.controller("RatingCtrl", function($scope) {
  $scope.rating1 = 1;
  $scope.rating2 = 2;
  $scope.isReadonly = true;
  $scope.rateFunction = function(rating) {
    console.log("Rating selected: " + rating);
  };
})
.directive("starRating", function() {
  return {
    restrict : "EA",
    template : "<ul class='rating' ng-class='{readonly: readonly}'>" +
               "  <li ng-repeat='star in stars' ng-class='star' ng-click='toggle($index)'>" +
               "    <i class='fa fa-star'></i>" + //&#9733
               "  </li>" +
               "</ul>",
    scope : {
      ratingValue : "=ngModel",
      max : "=?", //optional: default is 5
      onRatingSelected : "&?",
      readonly: "=?"
    },
    link : function(scope, elem, attrs) {
      if (scope.max == undefined) { scope.max = 5; }
      function updateStars() {
        scope.stars = [];
        for (var i = 0; i < scope.max; i++) {
          scope.stars.push({
            filled : i < scope.ratingValue
          });
        }
      };
      scope.toggle = function(index) {
        if (scope.readonly == undefined || scope.readonly == false){
          scope.ratingValue = index + 1;
          scope.onRatingSelected({
            rating: index + 1
          });
        }
      };
      scope.$watch("ratingValue", function(oldVal, newVal) {
        if (newVal) { updateStars(); }
      });
    }
  };
});

和css

.rating {
  margin: 0;
  padding: 0;
  display: inline-block;
}
.rating li {
  padding: 1px;
  color: #ddd;
  font-size: 20px;
  text-shadow: .05em .05em #aaa;
  list-style-type: none;
  display: inline-block;
  cursor: pointer;
}
.rating li.filled {
  color: #fd0;
}
.rating.readonly li.filled {
  color: #666;
}

http://codepen.io/anon/pen/RPLJYW

感谢您的帮助。

最佳答案

您可以使用两组相同的星星来实现这一点,将绝对的一颗放在另一颗的顶部。一个填充您的背景星形(灰色),顶部的一个位置将代表您的填充。

顶部的星星集已全部填充,但其容器的宽度可以调整为代表您的费率的星星比例。

var score = 2.4;
var maxStars = 5;
var starContainerMaxWidth = 100; //pixls
var filledInStarsContainerWidth = score / maxStars * starsMaxWidth;

隐藏的 CSS 溢出将隐藏未打开的星星部分,实际上允许您显示 2.4 颗已填充的星星。

更新:

我举了一个简单的例子 http://codepen.io/anon/pen/NqazVa , 需要整理和重新洗牌,但平均费率已正确计算和显示。

关于angularjs - 为angularjs中的评论创建十进制星级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30956488/

相关文章:

javascript - AngularJS:音频预览上的播放/静音按钮

javascript - 按年份对 Json 数据进行分组,以便使用 amchart 创建堆积条形图

javascript - 禁止取消选中 angularJS 中的所有复选框

angularjs - Angular 翻译内的指令

javascript - 如何修复 Angular 不使用显式注释并且不能在严格模式下调用

javascript - 无法在另一个日期选择器中更改日期选择器参数吗?

javascript - 如何使用谷歌地图中以条形图形式表示地点值的标记?

javascript - javascript中通过动态变量访问对象

javascript - 当我使用 ng-options 为什么我选择的没有值(value)

javascript - 使用 ng-click 自动传递 $event?