原版 :https://market.sencha.com/extensions/sencha-touch-2-rating-star-field

效果:

我的改造版(只是类名变了):

 Ext.define('ux.field.Rating', {
xtype: 'fieldRating',
extend: 'Ext.field.Field',
config: {
baseCls: Ext.baseCSSPrefix + 'field x-rating', /**
* @cfg {Number} value
* 默认值 0-5
*/
value: 0, /**
* @cfg {Boolean} editable
* 是否只读
*/
editable: true, /**
* @cfg
* @inheritdoc
*/
name: 'rating', /**
* @cfg
* @private
*是否显示清除按钮
*/
clearIcon: false, /**
* @cfg
* @private
*/
component: {
hidden: true,
xtype: 'input',
type: 'text',
useMask: true
},
/**
* @cfg {Boolean} labelMaskTap
* @private
*/
},
//布局模版
getElementConfig: function () {
var prefix = Ext.baseCSSPrefix;
return {
reference: 'element',
className: 'x-container',
children: [{
reference: 'label',
cls: prefix + 'form-label',
children: [{
reference: 'labelspan',
tag: 'span'
}]
}, {
reference: 'innerElement',
cls: prefix + 'component-outer',
html: ' ' +
'<div class="starContainer">' +
'<div class="left"></div>' +
'<div class="x-button x-button-action star star1"></div>' +
'<div class="center"></div>' +
'<div class="x-button x-button-action star star2"></div>' +
'<div class="center"></div>' +
'<div class="x-button x-button-action star star3"></div>' +
'<div class="center"></div>' +
'<div class="x-button x-button-action star star4"></div>' +
'<div class="center"></div>' +
'<div class="x-button x-button-action star star5"></div>' +
'<div class="right"></div>' +
'</div>' +
'<div class="starFakeContainer"></div>',
}]
};
},
initialize: function () {
var me = this;
me.callParent();
me.on('painted', function () {
me.starFakeContainer = me.innerElement.down('.starFakeContainer');
me.star1 = me.innerElement.down('.star1');
me.star2 = me.innerElement.down('.star2');
me.star3 = me.innerElement.down('.star3');
me.star4 = me.innerElement.down('.star4');
me.star5 = me.innerElement.down('.star5');
var value = me.getValue();
me.orignalValue = value;
me.activateStars(value); me.setEditable(me.getEditable());
});
},
applyEditable: function (editable) {
var me = this;
if (!me.starFakeContainer) {
return editable;
}
if (editable) {
me.starFakeContainer.on({
touchstart: me.onTouchStartMove,
touchmove: me.onTouchStartMove,
touchend: me.onTouchEnd,
scope: me
});
} else {
me.starFakeContainer.un({
touchstart: me.onTouchStartMove,
touchmove: me.onTouchStartMove,
touchend: me.onTouchEnd,
scope: me
});
}
return editable;
},
applyValue: function (value) {
var me = this;
if (value < 0) {
value = 0;
} else if (value > 5) {
value = 5;
}
me.activateStars(value);
return value;
},
activateStars: function (rating) {
if (!this['star1']) {
return;
}
for (var i = 1; i <= 5; i++) {
this['star' + i].removeCls('active');
}
for (var i = 1; i <= rating; i++) {
this['star' + i].addCls('active');
}
},
buildRating: function (delta) {
var width = this.starFakeContainer.getWidth(); if (delta >= width) {
delta = width;
} else if (delta <= 0) {
delta = 0;
}
delta = delta / width * 100;
var onePart = ((width / 12) / width * 100);
var rating = 0;
if (delta >= (onePart * 9)) {
rating = 5;
} else if (delta >= (onePart * 7)) {
rating = 4;
} else if (delta >= (onePart * 5)) {
rating = 3;
} else if (delta >= (onePart * 3)) {
rating = 2;
} else if (delta >= onePart) {
rating = 1;
}
this.setValue(rating);
return delta;
},
onTouchStartMove: function (a) {
var me = this;
var offsetLeft = me.innerElement.dom.offsetLeft;
if (offsetLeft) {
me.buildRating(a.pageX - offsetLeft);
}
},
onTouchEnd: function (a) {
var me = this;
var offsetLeft = me.innerElement.dom.offsetLeft;
if (offsetLeft) {
me.buildRating(a.pageX - offsetLeft);
}
var value = me.getValue();
if (me.orignalValue != value) {
me.orignalValue = value;
me.fireEvent('change', this, value, me.orignalValue);
}
}
});

所需css:

 /*#region 评分*/
.x-rating {
min-height:25px;
}
.x-rating .x-component-outer {
position:relative;
padding:0.6em;
min-height:40px;
}
.x-rating .starContainer,.x-rating .starFakeContainer {
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
}
.x-rating .starFakeContainer {
z-index:;
}
.x-rating .starContainer {
display:-webkit-box;
-webkit-box-align:center;
-webkit-box-pack:center;
}
.x-rating .starContainer .center,.x-rating .starContainer .left,.x-rating .starContainer .right {
-webkit-box-flex:1
}
.x-rating .star {
border:0px !important;
padding:0px !important;
margin:0px 0px 0px -12.5px !important;
position:absolute;
left:16.66%;
top:5px;
-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALMw9IgAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAB7BAAAewQHDaVRTAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuMzUw7rOfAAACdElEQVR4Xu2SSZaDMAwFc/9LpwkUBGN5kDy181yLDtbwVYt+vQczvcCrOIBfK6MFXht8Gplc4HO/0GBugeN+mcHUApzfoGBhZgGO71AyMLEAp4Ginp8RMOfYFx9QVmNd5OwNGlpmFeCoAy0lkwpw8gFNHXMKcNCDtorfErCEmXaCMKChroAhzbISgREFlQX0cYaNKAzlU1tAnadfSMBYNtUFtIHq+SQM5jKbAEeiMJrJZAKcSMBwHi0EVJmKYdKzYCWDrFFS1bAeJT5EUCGEyQS6rNaFbJdnldmGcOjketPuBmc3AQqD+A8CQw2O/wEeA9j/BwYa7Lc/fwYZHKf3v0MMuHz8DDA4D/Pb3YCzX4HOBhy9C3Q14OTG7bOjAQc/3L+7GXBux3l0MuDYgfvqYsApeDw7GHDo5PlubsCZC6/Q2IAjX/xKUwNO3BBKDQ04cEeqNTMg3kEsNjIg3EWuNjEg+kGg3MCA4CehenUDYj2CjcoGhPqEO1UNiBSItCoaECgR61UzIE4k2qxkQJhMvFtFgaQAKYFyA3JCNBcgJsgSSA0QUwBBIZbAEmgvkLiQaleAqABLYAl0EIifSHSrQJjMElgC0S4BxRAnsgRmF8ifClEkwFj2nESBAEM7lEIwJRHtxWDmgrIMMxJGASYcaEkwIWESoO9B24e+hEWAtgQTT+hKqNPoBWHMhZ5EpMeyC70IDLrQE9AJ0EnA8B06AhoB6hmw8IW6QL4A1UxYOqEqkCtATQGLB9QE8gSoKGF5h5JPpHNBwQABGxR80gI8jRBSIMDLTiImIcB3GXYBvooxCdQ7/yGcpm/Y6HVHzxIYLPB+/wEfB7NVrMbQ3wAAAABJRU5ErkJggg==') /*../icons/star.png*/ left center no-repeat;
-webkit-mask-size:25px 25px;
background-color:#ff0000;
width:25px;
height:25px;
opacity:.2;
-webkit-transform:scale(1,1);
}
.x-rating .star2 {
left:33.33%;
}
.x-rating .star3 {
left:49.99%;
}
.x-rating .star4 {
left:66.66%;
}
.x-rating .star5 {
left:83.33%;
}
.x-rating .star.active {
-webkit-transform:scale(1,1);
opacity:;
}
/*#endregion*/

使用(请自行调整样式):

 Ext.define('app.view.user.orders.Info', {
extend: 'Ext.form.Panel',
xtype: 'ordersInfo',
alternateClassName: 'ordersInfo',
requires: ['ux.field.Rating'],
config: {
title: '订单详情',
cls: 'info',
scrollable: {
direction: 'vertical',
indicators: false
},
items: [
{
margin: 5,
cls: 'border',
items: [{
label: '描述相符',
xtype: 'fieldRating',
name:'miaoShu'
},
{
label: '服务态度',
xtype: 'fieldRating',
name: 'fuwu'
},
{
label: '发货速度',
xtype: 'fieldRating',
name: 'fahuo'
}]
},
{
xtype: 'button',
margin: '10 20 10 20',
action: 'save',
text: '评分',
ui: 'orange'
}]
},
initialize: function () {
var me = this,
button = me.down('button');
button.on({
tap: 'onSave',
scope: me
});
me.callParent(arguments);
},
updateData: function (data) {
var me = this,
info = me.down('#info');
info.setData(data);
},
//保存数据
onSave: function () {
var me = this;
if (util.valid(Ext.create('app.model.Rating'), me)) {
me.fireEvent('save', me, me.getValues());
}
}
});

附送验证模型:

 //评分
Ext.define('app.model.Rating', {
extend: 'Ext.data.Model',
config: {
fields: [{
name: 'miaoShu',
type: 'int'
},
{
name: 'fuwu',
type: 'string'
},
{
name: 'fahuo',
type: 'string'
}],
validations: [{
field: 'miaoShu',
type: 'format',
matcher: /[1-5]/,
message: '请对描述相符进行评分!'
}, {
field: 'fuwu',
type: 'format',
matcher: /[1-5]/,
message: '请对服务态度进行评分!'
}, {
field: 'fahuo',
type: 'format',
matcher: /[1-5]/,
message: '请对发货速度进行评分!'
}]
}
});

sencha touch 评分扩展的更多相关文章

  1. sencha touch carousel 扩展 CardList 可绑定data/store

    扩展代码: /* *扩展carousel *通过data,tpl,store配置数据 */ Ext.define('ux.CardList', { extend: 'Ext.carousel.Caro ...

  2. sencha touch 侧边栏扩展(只隐藏不销毁)

    基于Ext.ux.MenuButton改造而来,和它不同的是,不会每次都去销毁侧边栏,只是单纯的隐藏,属性配置方面没啥区别,每次点击按钮显示时,会触发showMenu事件/方法 代码如下: /** * ...

  3. sencha touch tabsidebar 源码扩展

    先上图看效果 没错,这是一个sencha touch 项目,而这里的右边推出效果(下文叫做tabsiderbar),使用插件tabsiderbar来扩展的. 插件js下载地址:http://www.m ...

  4. 第一步 使用sencha touch cmd 4.0 创建项目、打包(加入全局变量、公用类、自定义扩展、资源文件)

    参考资料: http://www.cnblogs.com/qqloving/archive/2013/04/25/3043606.html http://www.admin10000.com/docu ...

  5. sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序

        这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...

  6. sencha touch 扩展篇之将sencha touch打包成安装程序(上)- 使用sencha cmd打包安装程序

    由于最近一直忙着android原生的开发,很久没有更新博客了,官方的sencha cmd工具功能非常强大,创建项目,压缩项目,打包安装程序都能轻松实现,这讲我们就给大家介绍下如何使用sencha cm ...

  7. sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标

    上一讲我们讲解了如何使用官方的api来修改主题样式,这讲我们继续讲解sass的样式修改, 编译官方自带的主题包  在生成的项目以及官方sdk的目录下,自带了一些主题sass包,我们也可以通过修改sas ...

  8. sencha touch 扩展篇之使用sass自定义主题样式 (上)使用官方的api修改主题样式

    大家知道,sencha touch是通过我们写的js代码来动态渲染单页面生成一个个div+css的html页面来模拟app应用,那么既然是div+css结构的,我们就可以通过修改css样式来自定义我们 ...

  9. sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩

    经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...

随机推荐

  1. C# 判断网站是不是discuz论坛

    if (this.txturl.Text == "") { this.lblmess.Text = "请输入网址"; } else { GetHttp getH ...

  2. <转>Win8.1+CentOS7 双系统 U盘安装

    0.准备工作 1.宏碁 Aspire 4752G 笔记本 2.Win8.1 企业版操作系统 3.8G 以上 U 盘 4.UltraISO(当然也可以选择其他的U盘制作工具,看个人喜好) 5.下载 Ce ...

  3. js pjax 和window.history.pushState,replaceState

    原文:http://blog.linjunhalida.com/blog/pjax/ github:https://github.com/defunkt/jquery-pjax 什么是pjax? 现在 ...

  4. RGB转LAB色彩空间

    1.原理 RGB无法直接转换成LAB,需要先转换成XYZ再转换成LAB,即:RGB——XYZ——LAB 因此转换公式分两部分: (1)RGB转XYZ 假设r,g,b为像素三个通道,取值范围均为[0,2 ...

  5. 利用neon技术对矩阵旋转进行加速(2)

    上次介绍的是顺时针旋转90度,最近用到了180度和270度,在这里记录一下. 1.利用neon技术将矩阵顺时针旋转180度: 顺时针旋转180度比顺时针旋转90度容易很多,如下图 A1 A2 A3 A ...

  6. Thinkphp5 runtime路径设置data

    路径设置 index.php // runtime文件路径define('RUNTIME_PATH', __DIR__ . '/data/runtime/');

  7. 大内核锁 BKL

    参考:http://blog.csdn.net/universus/article/details/5623971                                            ...

  8. Installshield Major upgrade

    Major upagrade: delete old version firstly, then install new version. need to change [product code] ...

  9. 详解ABBYY FineReader 12扫描亮度设置

    很多刚接触ABBYY FineReader 12的小伙伴可能出现过这样一个问题:在扫描过程中会显示一条消息以提示更改亮度设置.这是因为你 FineReader扫描设置中亮度未正确设置.下面小编就给小伙 ...

  10. Java用三元运算符判断奇数和偶数

    创建一个类,在该类的主方法中创建标准输入流的扫描器对象,提示用户输入一个整数,并通过扫描器的方法来接受这个整数,然后通过三元运算符判断该数字与2的余数,如果余数为0,说明其是偶数,否则是奇数. imp ...