原版 :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. 安卓开发笔记——GridView组件

    1.什么是GridView? GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的. 2.正文 GridVi ...

  2. 在PHP中使用curl_init函数的说明

    $ch = curl_init(); $c_url = 'http://www.baidu.com'; $c_url_data = "product_&type=".$ty ...

  3. svn管理码云项目

    1.设置SVN管理项目 进入项目->管理 2.获取SVN地址 3.SVN添加项目.单击右键 -> 检出->版本库Url(这里填写svn地址)

  4. 【WP8】ResourceDictionary

    WP8中引用资源字典 当我们定义的样式太多的时候,我们可以把样式分别定义在不同的文件中,然后通过 MergedDictionaries 应用到其他资源字典中,看下面Demo 我们可以把样式定义在多个文 ...

  5. [转]Linux内核源码详解--iostat

    Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...

  6. 【VirtualBox】ubuntu虚拟机与windows设置共享文件夹

    第一步:配置 http://blog.csdn.net/a962804835/article/details/72820355 第二步:解决ubuntu下共享文件夹无访问权限的问题 http://bl ...

  7. 8. Django系列之上传文件与下载-djang为服务端,requests为客户端

    preface 运维平台新上线一个探测功能,需要上传文件到服务器上和下载文件从服务器上,那么我们就看看requests作为客户端,django作为服务器端怎么去处理? 对于静态文件我们不建议通过dja ...

  8. 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式

    代码:转换用的代码放在这里 之前用Tensorflow提供的object detection API可以很方便的进行fine-tuning实现所需的特定物体检测模型(看这里).那么现在的主要问题就是数 ...

  9. [RN] 02 - Overview: React Native Practice of 50 lectures

    观看笔记:零基础 React Native 实战开发视频 50讲 本篇效果:RN入门,整体认识 基本原理 # 1 React到RN # 2 一个简单的例子 /** * Sample React Nat ...

  10. Android内存泄漏检測与MAT使用

    公司相关项目须要进行内存优化.所以整理了一些分析内存泄漏的知识以及工作分析过程. 本文中不会刻意的编写一个内存泄漏的程序,然后利用工具去分析它.而是通过介绍相关概念,来分析怎样寻找内存泄漏.并附上自己 ...