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的 ...
随机推荐
- 如何获取模拟器安装的app的位置
你可以死记下地址格式, 但是一旦不同的xcode和模拟器版本改变变了地址, 又得记, 从活动管理器里其实是可以直接查看的: Launch the app in the simulator Open A ...
- IBM Personal Communications 软件:精简绿色版TN3270终端模拟器:经测试可以在 (winxp、win2003、win764)上运行
全系列版本啊!耗费了我大量的时间和精力,深夜熬到3点! 注意:如何使用?解压后,里面有个reg注册表文件,以管理员权限用户双击加载即可. http://files.cnblogs.com/files/ ...
- 提高OCR质量的技巧之区域未正确检测
ABBYY FineReader会在识别前分析页面图像并检测图片上不同类型的区域,如文本.图片.背景图片.表格和条形码区域,此分析确定识别的区域和识别顺序.在用户界面中,不同的区域类型按其边界的颜色进 ...
- geoserver PostGIS的安装和使用
PostGIS是一个非常流行并且开源的具有空间分析能力的关系型数据库,它作为PostgreSQL数据库的一个插件.PostgreSQL是一个功能非常强大并且开源的关系型数据库.目前项目使用的版本为Po ...
- 源码分析三(Vector与ArrayList的区别)
前面讨论过ArrayList与LinkedList的区别,ArrayList的底层数据结构是数组Object[],而LinkedList底层维护 的是一个链表Entry,所以对于查询,肯定是Array ...
- orcle时间
Oracle计算时间差函数 两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差 (分别以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_D ...
- grid网格的流动一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 利用Python爆破数据库备份文件
某次测试过程中,发现PHP备份功能代码如下: // 根据时间生成备份文件名 $file_name = 'D' . date('Ymd') . 'T' . date('His'); $sql_file_ ...
- 在SELECT DISTINCT 状况下使用 Order BY Newid() 随机数选出记录
在日常作业中,有时候可能是一些活动要抽出得奖人或选出抽查的一些名单, 就常常会使用到 Order BY Newid() 的方式来做随机数选出, 但有可能的状况需是要搭配到 DISTINCT 来选出,这 ...
- hibernate sqlite jdbctemplate 待研究
http://my.oschina.net/lldy/blog/39058 hibernate sqlite http://foru ...