AngularJS实现星星等级评分功能


Posted in Javascript onSeptember 24, 2016

星期六加班,教育后台也要有星级评分等级的需求,醉了……基本知道些怎么做,网上也随便找了找,没什么合意的,毕竟需求不同,也不能完全一样不是。学习之,改之?(???)?

Directive 

angular.module('XXX').directive('stars', stars);

 function stars() {
  var directive = {
   restrict: 'AE',
   template: '<ul class="rating" ng-mouseleave="leave()">' +
    '<li ng-repeat="star in stars" ng-class="star" ng-click="click($index + 1)" ng-mouseover="over($index + 1)">' +
    '<i class="glyphicon glyphicon-star stars"></i>' +
    '</li>' +
    '</ul>',
   scope: {
    ratingValue: '=',
    hoverValue: '=',
    max: '=',
    onHover: '=',
    onLeave: '='
   },
   controller: startsController,

   link: function(scope, elem, attrs) {
    elem.css("display", "block");
    elem.css("text-align", "center");
    var updateStars = function() {
     scope.stars = [];
     for (var i = 0; i < scope.max; i++) {
      scope.stars.push({
       filled: i < scope.ratingValue
      });
     }
    };
    updateStars();

    var updateStarsHover = function() {
     scope.stars = [];
     for (var i = 0; i < scope.max; i++) {
      scope.stars.push({
       filled: i < scope.hoverValue
      });
     }
    };
    updateStarsHover();

    scope.$watch('ratingValue', function(oldVal, newVal) {
     if (newVal) {
      updateStars();
     }
    });
    scope.$watch('hoverValue', function(oldVal, newVal) {
     if (newVal) {
      updateStarsHover();
     }
    });
   }


  };

  return directive;

  /** @ngInject */
  function startsController($scope) {
   // var vm = this;
   $scope.click = function(val) {
    $scope.ratingValue = val;
   };
   $scope.over = function(val) {
    $scope.hoverValue = val;
   };
   $scope.leave = function() {
    $scope.onLeave();
   }

  }
 }

CSS 

.rating {

 color: #a9a9a9;
 margin: 0;
 padding: 0; 
 text-align: center;

}
ul.rating {
 display: inline-block;

}
.rating li {
 list-style-type: none;
 display: inline-block;
 padding: 1px;
 text-align: center;
 font-weight: bold;
 cursor: pointer;
}

 

.rating .filled {
 color: #f00;
}
.rating .stars{

 font-size: 20px;

 margin-right: 5px;

}

Controller 

//星星等级评分
  $scope.max = 6;
  $scope.ratingVal = 6;
  $scope.hoverVal = 6;//我这需求是默认六个星全满(淡腾,反正也招不出神龙.因为还差一个.)一般的话,ratingVal和hoverVal都写0就可以了。
  $scope.onHover = function(val) {
   $scope.hoverVal = val;
  };
  $scope.onLeave = function() {
   $scope.hoverVal = $scope.ratingVal;
  }
  $scope.onChange = function(val) {
   $scope.ratingVal = val;
  }

HTML

<stars rating-value="ratingVal" hover-value="hoverVal" max="max" on-hover="onHover" on-leave="onLeave"></stars>
ratingVal:{{ratingVal}};<br/>
hoverVal:{{hoverVal}}

说几句, 星星那东西,可以直接输入法敲出来,也可以用unicode搞出来,字体文件什么的都行,你要硬用图片的话……把ngClass换成ngSrc也可以试试,代码改改也行,精灵图改改background-position也凑合过,?(???)? 想了一下,比较累,祝你成功。

如果是那种商城网站只是要看评价等级的话,复用代码也可以,加个readonly属性。 

directive:
 scope: {
  readonly: '@'
 }
  function startsController($scope) {
   // var vm = this;
   $scope.click = function(val) {
    if ($scope.readonly) {
     return;
    }
    $scope.ratingValue = val;
   };
   $scope.over = function(val) {
    if ($scope.readonly) {
     return;
    }
    $scope.hoverValue = val;
   };

  }

controller:
 $scope.readonly = false;

html:
 readonly={{readonly}}.

写到这,突然意识到今后一定会改需求,加功能(已然习惯)。我还是默默地加上readonly吧……

指令这玩意,深了很绕,我也弄不熟,每次写还得翻翻以前写的代码,毕竟渣渣。每次不要复用的代码,我都懒得用指令,毕竟菜鸟。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype String对象 学习
Jul 19 Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 Javascript
Js动态添加复选框Checkbox的实例方法
Apr 08 Javascript
JavaScript中DOM详解
Apr 13 Javascript
微信小程序 绘图之饼图实现
Oct 24 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
React中如何引入Angular组件详解
Aug 09 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 Javascript
ElementUI 修改默认样式的几种办法(小结)
Jul 29 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
完美的js div拖拽实例代码
Sep 24 #Javascript
javascript 解决浏览器不支持的问题
Sep 24 #Javascript
JavaScript生成验证码并实现验证功能
Sep 24 #Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 #Javascript
javascript 分号总结及详细介绍
Sep 24 #Javascript
Bootstrap对话框使用实例讲解
Sep 24 #Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 #Javascript
You might like
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
js里的prototype使用示例
2010/11/19 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
python如何通过protobuf实现rpc
2016/03/06 Python
python机器学习之决策树分类详解
2017/12/20 Python
Flask框架信号用法实例分析
2018/07/24 Python
python 函数中的参数类型
2020/02/11 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
如何用Lucene索引数据库
2016/02/23 面试题
军神教学反思
2014/02/04 职场文书
世博会口号
2014/06/20 职场文书
优秀员工推荐材料
2014/12/20 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
消防验收申请报告
2015/05/15 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL