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 ...
随机推荐
- appstore开发者 名称修改
1.前提是开发者账号为企业账号 CSDN大佬写的,应该没错
- C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)
1.条件编译介绍 条件编译(conditional compiling)命令指定预处理器依据特定的条件来判断保留或删除某段源代码.例如,可以使用条件编译让源代码适用于不同的目标系统,而不需要管理该源代 ...
- Mybatis 延迟加载策略
延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 ...
- 【转】WinForm时间选择控件(DateTimePicker)如何选择(显示)时分秒
源地址:https://www.cnblogs.com/EvanFan/p/7826160.html 注意:年月日时分秒的大小写格式,如果错了数据就错了,如果能显示当前时间说明设置正确
- CF1137F Matches Are Not a Child's Play(树链剖分)
题面 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当前序列的最末端,最后只剩下一个节点时将该节点的编号加入到结尾. 例如对于上图中的树,它的删除序列为:2 4 3 1 ...
- ueditor的bug
1)过滤script style标签ueditor.all.jsallowDivTransToP:false ueditor.config.js,allowDivTransToP:false //允许 ...
- nginx负载均衡fair模块安装和配置
nginx-upstream-fair-master fair模块源码 官方github下载地址:https://github.com/gnosek/nginx-upstream-fair说明:如果从 ...
- eclipse搭建maven project的spring4 spring mvc mybatis
一,先确定已经安装好了Eclipse Java EE IDE for Web Developers我用的是如下版本 Version: Neon.3 Release (4.6.3)Build id: 2 ...
- postgresql中的各种scan的比较
最近在看postgresql的查询计划,在查询中对表的扫描计划大概有如下几种: Seq Scan Index Scan Bitmap Heap Scan Index Only Scan 这里就把自己的 ...
- 杀死进程命令 kill
一般kill命令和ps命令结合使用, 例:现在想杀死telnet的进程 1.在所有进程中查看telnet命令 ps -ef |grep telnet 2.根据上面命令查到的进程id,如pid 是 xx ...