万年没更新了. 最近用jquery weui. 在使用picker时需要一些问题.

就是让picker 显示label, 但是取值的时候取value用于存储. 官网例子如下

Jquery-weui 官网 : 点这里  写这篇文章时,用的版本是1.2.1版本

$("#picker-name").picker({
title: "请选择您的称呼",
cols: [
{
textAlign: 'center',
values: ['赵', '钱', '孙', '李', '周', '吴', '郑', '王']
//如果你希望显示文案和实际值不同,可以在这里加一个displayValues: [.....]
},
{
textAlign: 'center',
values: ['杰伦', '磊', '明', '小鹏', '燕姿', '菲菲', 'Baby']
},
{
textAlign: 'center',
values: ['先生', '小姐']
}
]
});

但是文本框中显示的依然是value !!!!!

于是只能想其他办法. 在onChange中将value存储到 data-values中. 效果就达到了.

但是!!!!!

界面操作是没问题了,接着其他问题就来了.

当从数据库查出来时, 界面依然是显示 value, 因为数据库存的就是value.

我试图在取出数据后改变文本框的值. 看起来正常了.

$.ajax ({
...
success: function(){
$("#input").val(值的Text)
}
})

还是但是!!!

有2个问题

1、你在执行 $("#input").val(值) 时未必已经能加载出picker的数据源了.  所以你不一定能通过value拿到text去显示

2、就算你先拿出了picker的数据源, 再去加载数据库的值设置. 看上去是没问题了. 但是当你点击的时候..并不会默认指向你的值, 还会把你的值改成第一项。。。

(关于第二点,  查了下,好像是说picker是在打开过后才初始化内部的内容, 试了下以下代码可行  )

$("#input").picker("open");
$("#input").picker("setValue", [由值算出的文本]);
$("#input").picker("close");

  以上代码确实可行了, 但是当你onChange里处理其他逻辑时就头疼了...因为这几句代码么会触发onChange事件.

  举例子:  picker 选择性别  . 男的身高默认170,  囡的身高默认160,

  所以你需要在onChange里去更新身高的文本框, 这时用户改了身高为175保存.

  当你从数据库取出来用以上代码设置性别时, 会触发onChange事件又把身高改成170了.

最终办法:

结合以上问题得出思路:

1、二次封装picker

2、在每次值发生改变时, 将label设置到文本框,  value设置到 data-values

3、提供setValue(v) 方法. 此方法即使数据源没加载出来依然会记录下value, 等到数据源加载出来了会取value出来更新作为默认的值

4、提供setDataSource(data) 方法, 此方法调用时将已存储设置的值拿出来重算一次label显示.

5、提供getValue() 获取值

注意: picker初始化后再设置文本框的值不会更新picker的值, 因此点击弹出时不会定位到默认值, 这里的解决办法是 destroy后重新初始化.

不说了,累了几天了头脑很乱也不知道写得看不看得懂.  直接上插件代码.

/* 二次封装weui的picker, 主要是目前的picker不支持text和value的方式使用,所以封装一下,同时让他支持异步加载数据 */
/*
* title picker的标题. 跟picker一样
* value 当前值
* data 数据源, 对象集合, 对象必须包含 label 和 value 属性.
* allowEmpty 是否追加空白数据, 默认为true并追加空白数据
* onChange 选项变更事件, 不同于原picker的是多了第2个参数, 第二个参数为当前所有选项列表. 且仅当选项改变才触发 (原picker只要点击就会触发)
*
* 例子: var picker = $("#selector").pickerPlus({}).data("pickerPlus");
*
* 可使用方法:
* picker.setValue(value) 设置值, 传入的picker必须为数据对象的 value, 支持预设置. 即在数据源未加载完成前设置. (原picker一旦设置数据源, 无法再修改值, 除非open, setValue, close)
* picker.setDataSource(data)设置数据源
* picker.getValue() 获取值. 注意.原$("#selector").val()拿到的是label,需要用此方法获取值. 或者$("#selector").attr("data-values")获取值
*/ (function ($) {
var defaultSettings = {
title: '',
data: [],
value: '',
allowEmpty: true,
onChange: function () { }
}; $.fn.pickerPlus = function (settings) {
return this.each(function () {
var elem = $(this);
elem.data('pickerPlus', new P(elem, settings));
});
} function P(elem, settings) {
this.elem = elem;
this.picker = null;
this.settings = $.extend({}, defaultSettings, settings || {});
this.init();
return this;
} P.prototype = {
init: function () {
let that = this,
elem = that.elem,
setting = that.settings; if (setting.allowEmpty && !setting.data.find(x => x.value == "")) {
setting.data.splice(0, 0, { label: '', value: '' })
} let obj = setting.data.find(x => x.value == setting.value);
if (obj) {
elem.val(obj.label);
}
elem.attr("data-values", setting.value); that.picker && that.picker.destroy(); elem.picker({
title: setting.title,
cols: [
{
textAlign: 'center',
values: setting.data.map(x => x.label)
}
],
onChange: function (e) {
let oldValue = that.settings.value;
let newValue = that.settings.data.find(x => x.label == e.value[0]).value; that.settings.value = newValue;
if (oldValue != newValue)
setting.onChange && setting.onChange(e, setting.data);
}
}); that.picker = that.elem.data('picker');
},
setDataSource: function (data) {
let that = this,
elem = that.elem,
setting = that.settings; that.settings.data = data;
that.init();
return this;
},
setValue: function (key) {
let that = this,
elem = that.elem,
setting = that.settings; that.settings.value = key; that.init();
return this;
},
getValue: function () {
return this.settings.value || '';
}
} })(jQuery);

使用方式

1、引入

2、界面初始化时var picker = $("#input"),pickerPlus( {  选项 } ).data("pickerPlus");

3、赋值时picker.setValue("value")

4、设置数据源时 picker.setDataSouce(data)  格式为数组对象 [{ label: '内容', value: '值' }]

4、获取值时picker.getValue()

这样一来,无需再关心是不是要等数据源先加载还是先设置文本框值的问题了.

插件写的很匆忙很乱,暂时没时间优化. 另外如果有其他更好的方案也可以告诉我。谢谢

Jquery weui picker 支持label和value的更多相关文章

  1. jQuery weui Select组件显示指定值

    jQuery weui有个支持单选或者多选的select弹出层,默认他是这样的 第2部分选择什么值,第1部分就显示什么值,一般的场景支持是没问题了,但本次开发碰到了一个问题. 需求描述: 职业名称后面 ...

  2. WeUI Picker组件 源代码分析

    前言 由于最近做的一个移动端项目需要使用到类似 WeUI Picker组件 的选择效果,  所以在这里来分析下 WeUI Picker 的实现逻辑.(weui.js项目地址) 之前也做过类似的组件, ...

  3. 基于Jquery WeUI的微信开发H5页面控件的经验总结(1)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  4. 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  5. jQuery WeUI V0.4.2 发布

    http://www.oschina.net/news/71590/jquery-weui-v0-4-2 jQuery WeUI V0.4.2 发布了! jQuery WeUI 中使用的是官方WeUI ...

  6. jquery weui 图片浏览器Photo Browser

    jquery weui 图片浏览器Photo Browser 如何使用? 对应组件地址:http://jqweui.com/extends#swiper 先说说业务场景:类似朋友圈这样的布局效果,点击 ...

  7. 16款最佳的 jQuery Time Picker 时间选择插件

    jQuery 插件可以为你做许多事情,你可以很容易地把这些插件集成到您的网站.网络上的 jQuery 日期选择器和日历插件很多,但找不到很满意的时间选择器插件. 在这里,我们收集了最好的一组 jQue ...

  8. JS和Jquery获取和修改label的值的示例代码

    abel标签在JS和Jquery中使用不能像其他标签一样用value获取它的值,下面有个不错的示例,希望大家可以学习下 来源:  <  JS和Jquery获取和修改label的值的示例代码  & ...

  9. Jquery WeUI(一)

    用于微信端的控件UI , 首先,需要做的是开发一个微信能访问的网页,并和微信关联 A. 创建一个空网站 B. 增加一般处理程序 A. 增加 web 网页 和空文件到项目中 B. 申请和配置测试服务 创 ...

随机推荐

  1. [Linux]标准IO全缓冲和行缓冲

    概述 标准IO中,标准错误是不带缓冲的.若是指向终端设备的流才是行缓冲的,否则是全缓冲的. 行缓冲也可以分配缓冲区,当遇到超大行(超过缓冲区的行),缓冲区内容也会优先刷出. 示例 #include & ...

  2. LeetCode 7. Reverse Integer(c语言版)

    题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123Output: 321 Ex ...

  3. VS 编码规范---- 代码注释设置

    一个良好的代码风格在开发过程和后期维护过程中是必不可少的.每次在添加新类的时候都需要添加一些关于类的注释,包括创建时间.创建人.类的功能介绍.修改时间等一系列的信息,以方便以后的查找和快速了解.在Co ...

  4. CSRF & CORS 的区别

    转发 CSRF & CORS 的区别 下面转的两篇文章分别说明了以下两个概念和一些解决方法: 1. CSRF - Cross-Site Request Forgery - 跨站请求伪造 2. ...

  5. 关于haproxy

    高性能负载均衡软件 haproxy 一.四层和七层负载均衡的区别: 所谓的四层就是OSI参考模型中的第四层,四层负载均衡也称为四层交换机,他主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加 ...

  6. linux安装postgresql简洁版

    环境: linux 7.+ postgresql 10.5 1.下载10.5版本的源码,make后成可执行版本 2.创建数据库   initdb -D   /xxx/yyy(对应为数据目录,提前创建好 ...

  7. docker-compose yaml mysql和wordpress 一行命令搞定~~~

    version: '3.1' services: db: container_name: db image: mysql/mysql-server restart: always networks: ...

  8. CentOs下手动升级node版本

    查找对应的nodejs包,具体参考https://nodejs.org/download/release/ 切换到安装node的位置 此处为/usr/local/lib/nodejs 不存在可以建立 ...

  9. Jmeter3.2默认自带的HTML报告

    jmeter -JthreadNum=50 -JinSec=1 -Jduration=300 -n -t $JMETER_HOME/XNZX/scripts/XNZX_APP.jmx -l $JMET ...

  10. Java重头学

    前言:这两周来上了腾讯课堂-软媒-JAVA架构师黄埔班的课程后,发现自己真心是一个菜鸟,Java基础知识和日常开发所需的知识还有很多很多.就此,我准备跟着这个课程重头学习Java,成为一名合格的Jav ...