一、需求演变及描述:

1. 有一个“客户对公司的总体评价”的字段(evalutation)。字段为枚举类型,0-5,对应关系为:0-暂无评价,1-很差,2-差,3-一般,4-好,5-很好

2. 后来需要根据评分使用星星来表现,一共5颗星,分为实星和空星,例如,当3分时,三颗星星被点亮,即3颗实星2颗空星。

二、开发前准备:

1. 用于描述星星的图标,也可以是图片,我这里使用 iconfont

2. 新建一个星级评分组件,便于复用

通过命令 ng g component rating 我新建了一个星级评分组件

三、从父组件中获取“客户对公司的总体评价”的字段的值

通常控制星星显示的 evalutation 值都是一个从父组件传递出去的Number类型值。 
1、首先我们需要在调用星级组件的父组件模板中将值传递出去:

<li class="companyevalutation">客户对公司的总体评价:
<app-rating [starsRating]="repairs.evalutation"></app-rating>
</li>

说明:app-rating 是新建的星级评分组件,使用 starsRating 属性绑定 evalutation 的值

2、星级组件为了获得这个值,需要使用输入属性 @Input() 
在星星组件的控制器(rating.component.ts)中写这样一段代码

@Input()
private starsRating: number = 0;

说明:@input 用来定义模块的输入,用于从父组件向子组件传递数据

在这里可以将 starsRating 的值传递出去。

三、显示实星和空星

1. 显示5颗实星

要显示5颗实星可以这样做:

<span class="iconfont icon-start_c"></span>
<span class="iconfont icon-start_c"></span>
<span class="iconfont icon-start_c"></span>
<span class="iconfont icon-start_c"></span>
<span class="iconfont icon-start_c"></span>

但是这样的做法未免太过暴力,假如要显示100颗星,岂不是要写100行同样的代码。

显示5颗实星,可以使用 angular 的循环

<span *ngFor="let star of stars;" class="iconfont icon-start_c"></span>

同时在控制器里面,定义 stars 的值:

stars: boolean[];

constructor() { }

ngOnInit() {
this.stars = [true, true, true, true, true];
}

这样就得到了5颗实心的星星。

star 的值为 true 时,添加 icon-start_n 类,显示空星。

<span *ngFor="let star of stars;" class="rating iconfont icon-start_c" [class.icon-start_n]="star"></span>

获取实际的星星个数:

get starsRating(): number {
return this._starsRating;
} @Input() set starsRating(value: number){
this._starsRating = value;
this.rating();
}

stars 为布尔型的数组,值为 false 将会显示实星,值为 true 将会显示空星。

public rating(): void {
this.stars = [];
for (let i = 1; i <= 5; i++){
this.stars.push(i > this.starsRating);
}
}

如果 starRating 的值为 3,stars = [false, false, false, true, true]; 视图显示三颗实星,两颗空星

四、源码:

rating.component.html:

<span *ngFor="let star of stars;" class="rating iconfont icon-start_c" [class.icon-start_n]="star"></span>

rating.component.ts:

import {Component, Input, OnInit} from '@angular/core';

@Component({
selector: 'app-rating',
templateUrl: './rating.component.html'
})
export class RatingComponent implements OnInit { public _starsRating: number = 0;
public stars: boolean[]; get starsRating(): number {
return this._starsRating;
} @Input() set starsRating(value: number){
this._starsRating = value;
this.rating();
} constructor() { } ngOnInit() {
this.rating();
} public rating(): void {
this.stars = [];
for (let i = 1; i <= 5; i++){
this.stars.push(i > this.starsRating);
}
} }

Angular 星级评分组件的更多相关文章

  1. 干货之运用CALayer创建星级评分组件(五角星)

    本篇记录星级评分组件的创建过程以及CALayer的运用. 为了实现一个星级评分的组件,使用了CALayer,涉及到mask.CGPathRef.UIBezierPath.动画和一个计算多角星关键节点的 ...

  2. vue星级评分组件

    <template> <div class="Rating-gray"> <i v-for="(item,index) in itemCla ...

  3. js实现星级评分效果(非常规5个li代码)

    1. 前言 此方案受到JS单行写一个评级组件启发,自己写了一个简单Demo. 功能有正常滑动,动态显示实心星星个数:当点击确认,则保持当前的实心星星个数:再移动时未点击,则离开后还是保持之前的状态. ...

  4. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  5. 原生JS实现-星级评分系统

    今天我又写了个很酷的实例:星级评分系统(可自定义星星个数.显示信息) sufuStar.star();使用默认值5个星星,默认信息 var msg = [........]; sufuStar.sta ...

  6. javascript星级评分(多个)

    JS打多个类型星级评分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  7. js星级评分点击星级评论打分效果

    html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  8. js星级评分点击星级评论打分效果--收藏--转载

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. JavaScript星级评分

    事件onmouseover <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

随机推荐

  1. Linq学习教程

    http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html

  2. api.setFrameGroupIndex

    设置 frame 组当前可见 frame setFrameGroupIndex({params}) params name: 类型:字符串 默认值:无 描述:frame 组名字 index: 类型:数 ...

  3. C# 进程间共享内存通信方式

    从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 ...

  4. thinkphp 查询单个“年-月-日” FROM_UNIXTIME

    *时间格式转换,使datetimepicker.js 能够搜索 查询 单个 年月日而不需是区间 查询. //另起一行看转换结果 select *,FROM_UNIXTIME(CreateTime,'% ...

  5. 设置TableView section header的颜色

      - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInte ...

  6. HNCU专题训练_线段树(2)

    1.统计颜色,或运算的运用2.区间第k大数3.一个很经典的题5.求区间相等数字的个数6.RMQ模板题,区间最大值和最小值的差 1.很好的思路,用或运算来避免左右儿子树总相同颜色的情况.由于T颜色种类最 ...

  7. idea创建maven的web工程

    然后一路点next 接下去添加tomcat 成功 控制台出现乱码的话 输入:-Dfile.encoding=UTF-8 控制台乱码解决

  8. 算法 - 排序数组中与x最近一点

    条件: a[j] + a[j+1] < x*2 int findClosestPoint(int x,int a []) { int res = 0; int j = 0; while(j< ...

  9. Yii中文乱码 解决

    需要将config/main.php改成utf-8编码即可

  10. AJAX-XMLHttpRequest和本地文件

    网页中可以使用相对URL的能力通常意味着我们能使用本地文件系统来开发和测试HTML,并避免对Web服务器进行不必要的部署. 然而当使用XMLHttpRequest进行Ajax编程时,这通常是不行的. ...