avalon实现日期联动
前言
上一篇我们说了下Avalon的一些概念,以及一些主要特性,至于Avalon的一些基础教程,正美老师已经做了非常全面的讲述,参见:http://www.cnblogs.com/rubylouvre/p/3962848.html
以后我们将使用Avalon做几个实际的小例子,也是我在工作中使用中的东西,avalon的文档特别全,但是生产中使用的例子却非常少,所以我会在博客中多写些我工作中使用的例子。
这次先是一个日期联动组件,效果和源码请参照:http://runjs.cn/detail/vsuij302
这个简单的小组件能实现:1.默认三个下拉框选中的是当前的年月日。2.可自定义初始显示几年的数据。3.选择年和月的时候,可以自动判断日有多少天。4.当选择到1月31日时,切换成2月,自己定位到2月的最后一天,不会出错。
首先我们来看HTML部分
<div ms-controller="dateCtrl">
<select ms-duplex="year">
<option ms-repeat="yearArr">{{el}}</option>
</select> <select ms-duplex="month">
<option ms-repeat="monthArr">{{el}}</option>
</select> <select ms-duplex="day">
<option ms-repeat="dayArr">{{el}}</option>
</select>
</div>
HTML部分,第一首先定义了一个controller,然后是三个select下拉框,用于显示年、月、日;ms-duplex用于和VM中M层进行双向绑定,ms-repeat用于循环展示哪些年、哪些月、哪些日。
Avalon部分:
定义VM
var dateVM = avalon.define({
$id : "dateCtrl",//- controller的id
yearsAgo : 10,//- 展示多少年
yearArr : [],//- 年的数组
year : 1,//- 年,用于监听
monthArr : [],//- 月的数组
month : 1,//- 月,用于监听
dayArr : [],//- 日的数组
day : 1//- 日,用于监听
});
定义VM部分比较简单,有注释,且都是必填项。
初始化部分
avalon.ready(function(){
date.init(dateVM);
});
实现逻辑部分
//- 日期联动效果使用说明
//- 使用时, 需要在VM中定义下面6个参数, 调用init方法, 把当前VM作为参数传进去就可以
//- 如果没有日的选项, day和dayArr可定义
//- 注意:使用时, 在View层的select必须使用ms-duplex进行双向绑定
//- year : 1,
//- month : 1,
//- day : 1,(可不定义)
//- yearArr : [],
//- monthArr : [],
//- dayArr : [](可不定义)
var date = {
init : function(dateVM) {
var _this = this;
_this.initDate(dateVM);
if(dateVM.day) {
dateVM.$watch("year", function(){//- 监听年, 重新渲染日
_this.renderDay(dateVM);
});
dateVM.$watch("month", function(){//- 监听月, 重新渲染日
_this.renderDay(dateVM);
});
}
},
initDate : function(dateVM) {
var _this = this;
var yearArr = [];
var monthArr = [];
var dayArr = [];
var today = new Date();
var year = today.getFullYear();
//- 填充yearArr, 只取当前年的前三年
for(var i=year-dateVM.yearsAgo; i<=year; i++) {
yearArr.push(i);
}
dateVM.year = year;//- 放到VM中
dateVM.yearArr = yearArr;//- 放到VM中
var month = today.getMonth()+1;
//- 填充monthArr, 每年有十二个月
for(var i=1; i<=12; i++) {
monthArr.push(i);
}
dateVM.month = month;//- 放到VM中
dateVM.monthArr = monthArr;//- 放到VM中
if(dateVM.day) {//- 可能只需要年和月, 不需要日
var day = today.getDate();
//- 填充dayArr, 根据年和月的不同, 天数也不同
var lastDay = _this.getLastDay(year, month);
for(var i=1; i<=lastDay; i++) {
dayArr.push(i);
}
dateVM.day = day;
dateVM.dayArr = dayArr;
}
},
renderDay : function(dateVM) {
var _this = this;
var lastDay = _this.getLastDay(dateVM.year, dateVM.month);
if(dateVM.day > lastDay) {//- 解决当从5月切成2月时, 下拉为空的问题, 现在是定位到最后一天
dateVM.day = lastDay;
}
var dayArr = [];
for(var i=1; i<=lastDay; i++) {
dayArr.push(i);
}
dateVM.dayArr = dayArr;
},
getLastDay : function(year,month){//- 获得某月的最后一天
var new_year = year;//- 取当前的年份
var new_month = month++;//- 取下一个月的第一天,方便计算(最后一天不固定)
if(month>12) {
new_month -=12;//- 月份减
new_year++;//- 年份增
}
var new_date = new Date(new_year,new_month,1);//- 取当年当月中的第一天
return (new Date(new_date.getTime()-1000*60*60*24)).getDate();//- 获取当月最后一天日期
}
}
这里重点说下$watch部分,因为需要在切换年和月的时候要动态的计算这个月有多少天(就是二月),所以监控年和月,当他们改变的时候,会计算有多少天,并重新把dayArr里面的数据清空,重新填充,这样VM就会自动同步到V中,而不像jQuery一个,根据ID或者class,重新选择DOM,
拼HTML
avalon实现日期联动的更多相关文章
- jQuery日期联动插件
此版本为网上的日期联动插件修改版,加入了修改后事件 /* * jQuery Date Selector Plugin * 日期联动选择插件 * * Demo: $("#calendar&qu ...
- JS Select 月日日期联动
Js对Select控件进行联动操作,一个select选择月份后另一个select生成对应月份的所有日期. <%@ Page Language="C#" AutoEventWi ...
- 生日日期联动选择birthday.js
实例下载
- JS年月日三级联动下拉框日期选择代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- html年月日下拉联动菜单 年月日三下拉框联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 纯javascript联动的例子
有人想要学习下纯javascript联动的一些技巧,我这里就以日期的联动为例,附上一些代码至于复杂的省市区联动,不建议用纯javascript的,而是用ajax的方式,该不在此讨论范围内,想要了解aj ...
- JS实现年月日三级联动+省市区三级联动+国家省市三级联动
开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...
- js修改日期
需求说明: (1)首先是input显示年月日时分格式时间,其中年月日实在本地时间基础上,加上后面联动值.小时默认08:00不变 (2)后面input内显示天数,右侧加减按钮,控制天数,天数确定后,前面 ...
- js实现年月日三级联动
当我们注册一个qq的时候,会看到一个三级年月日的联动菜单,下面简单介绍. <!doctype html> <html lang="en"> <head ...
随机推荐
- 微信H5或PC支付常见问题汇总
1.H5端调起支付,直接提示[支付失败],打印具体的信息,“<当前URL不存在>” 原因: ①.[支付授权目录不对]---查看微信商户平台的支付授权目录的地址,如果MVC结构的,则只需填写 ...
- java 笔记整理
在19寒假对java基础进行自学,总结的笔记整理出来 ==================================================== 排序查找 冒泡排序法1.一共会比较数组元 ...
- Druid连接池默认配置和坑
一.公司默认配置 ds_0: !!com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: ...
- 关于Java中SQL语句的拼接规则
实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...
- (转)取消目录与SVN的关联
第一种方法: 直接.逐级地删除目标目录中的隐藏属性的.svn目录 第二种方法: 如果用的是TortoiseSVN客户端,则先在另外一处建立一个新目录A,右键点住svn目录并拖动到A上松手,在弹出的菜单 ...
- Matlab2015 双目相机自动标定
标定步骤 调出标定工具箱 在命令行输入stereoCameraCalibrator,出现如下界面: 勾选相应的选项 然后将上面的“Skew”.“Tangential Distortion”以及“3 C ...
- CBoard 看板参数管理
看板设计采用简单Row+Column布局模式,每行总长度为12,每列对应一个图表,行高度可以调节,列高度集成行高 左边栏看板分类中,我的看板为当前用户创建的看板,普通看板分类通过分类管理维护,保存看板 ...
- JavaWeb学习笔记(七)—— JSP
一.什么是JSP JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术.在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页 ...
- thinkphp3.2.3 批量包含文件
自己瞎写的...凑合看吧...核心就是用正则 表达式 或者 字符串 str_replace 进行 替换....... /** * 批量包含---,不能递归包含!!! 请不要在目标目录 包含 文件夹,因 ...
- C++_标准模板库STL概念介绍3-函数对象
函数对象也叫做函数符(functor). 函数符是可以以函数方式和( )结合使用的任意对象. 包括函数名,指向函数的指针,重载了()运算符的类对象. 可以这样定义一个类: class Linear { ...