sencha touch 评分扩展
原版 :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 评分扩展的更多相关文章
- sencha touch carousel 扩展 CardList 可绑定data/store
扩展代码: /* *扩展carousel *通过data,tpl,store配置数据 */ Ext.define('ux.CardList', { extend: 'Ext.carousel.Caro ...
- sencha touch 侧边栏扩展(只隐藏不销毁)
基于Ext.ux.MenuButton改造而来,和它不同的是,不会每次都去销毁侧边栏,只是单纯的隐藏,属性配置方面没啥区别,每次点击按钮显示时,会触发showMenu事件/方法 代码如下: /** * ...
- sencha touch tabsidebar 源码扩展
先上图看效果 没错,这是一个sencha touch 项目,而这里的右边推出效果(下文叫做tabsiderbar),使用插件tabsiderbar来扩展的. 插件js下载地址:http://www.m ...
- 第一步 使用sencha touch cmd 4.0 创建项目、打包(加入全局变量、公用类、自定义扩展、资源文件)
参考资料: http://www.cnblogs.com/qqloving/archive/2013/04/25/3043606.html http://www.admin10000.com/docu ...
- sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序
这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...
- sencha touch 扩展篇之将sencha touch打包成安装程序(上)- 使用sencha cmd打包安装程序
由于最近一直忙着android原生的开发,很久没有更新博客了,官方的sencha cmd工具功能非常强大,创建项目,压缩项目,打包安装程序都能轻松实现,这讲我们就给大家介绍下如何使用sencha cm ...
- sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标
上一讲我们讲解了如何使用官方的api来修改主题样式,这讲我们继续讲解sass的样式修改, 编译官方自带的主题包 在生成的项目以及官方sdk的目录下,自带了一些主题sass包,我们也可以通过修改sas ...
- sencha touch 扩展篇之使用sass自定义主题样式 (上)使用官方的api修改主题样式
大家知道,sencha touch是通过我们写的js代码来动态渲染单页面生成一个个div+css的html页面来模拟app应用,那么既然是div+css结构的,我们就可以通过修改css样式来自定义我们 ...
- sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...
随机推荐
- 通过tarball形式安装HBASE Cluster(CDH5.0.2)——如何配置分布式集群中的zookeeper
集群安装总览参见这里 Zookeeper的配置 1,/etc/profile中加入zk的路径设置,见上面背景说明. 2,进入~/zk/conf目录,复制zoo_sample.cfg为zoo.cfg v ...
- 安装vmware vCenter Appliance
vcenter appliance是一个vmware配置好的基于suse系统的vcenter的all in one式的虚拟机,比安装基于windows的vcenter服务省事多了,所以我选择部署vCe ...
- Thinkphp5笔记二:创建模块
系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 我的项目是部署在本地www/thinkphp 目录下.在做之前,先要考虑清楚,你需要几个模块来完成你 ...
- CocoaPods 第三方库管理器
下载地址:https://github.com/kattrali/cocoapods-xcode-plugin 跟 VVDocumenter 规范注释生成器的安装方式一样: 下载开源工程在 Xcode ...
- windows下卸载oracle11g
oracle11g卸载 oracle11g卸载 卸载oracle: 1.开始--控制面板--性能和维护--管理工具--服务 停止所有的oracle服务. 2.开始--程序--oracle-- ...
- Win7 共享打印机 “错误:共享无法保存设置”
原因:windows的后台防火墙服务进程[Windows Firewall{服务描述}.MpsSvc{服务名字}] 关闭了.services.smc 关闭 解决:重启服务 关闭防火墙的功能,通过控制面 ...
- Ruby 面向对象知识详解
Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象.类本身也是一个对象 ...
- python操作mysql数据库实现增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...
- 使用pycharm,追求最优的代码。
1.最近追求的是代码0警告,没有任何提示. 怎么追求这样的目标,不需要再去单独使用pylint和flake8这些玩意,只需要看pycharm右边编辑区的竖向滚动条的黄色就可以了. 2. 比较糟糕的就是 ...
- MTK 强制横屏
frameworks\base\policy\src\com\android\internal\policy\impl目录下的PhoneWindowManager.java的rotationForOr ...