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 ...
随机推荐
- windows查看和杀死占用端口的进程
1.首先使用 netstat -ano查看占用端口的进程号 2.然后使用 taskkill /PID (进程号)杀死进程
- 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断
一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...
- 【java】AtomicReference介绍
本文转载自:http://www.cnblogs.com/skywang12345/p/3514623.html 概要 本章对AtomicReference引用类型的原子类进行介绍.内容包括: Ato ...
- 一个简单的Samba服务
上次给大家认识了下,搭建一个服务大概的一个认识. 这次给大家搭建一个Samba服务认识下. 项目准备: 虚拟机一个(Centos6.5版本) 项目目标: 进行samba最简单的配置 项目难度: ❤❤ ...
- ubuntu15.04下安装docker
##获得更多资料欢迎进入我的网站或者 csdn或者博客园 最近听说docker很火,不知道什么东西,只知道是一个容器,可以跨平台.闲来无事,我也来倒弄倒弄.本文主要介绍:ubuntu下的安装,以及基 ...
- ASP.Net一般处理程序Session用法
1.在aspx和aspx.cs中,都是以 Session["type"]="aaa" 和 string aaa=Session["type" ...
- 批量改ID 行形式
update [Temp_Sql] set ID(字段) = (274+ID(字段)) 字段+字段形式 可以以行形式批量修改
- phpstorm利用database连接mysql数据库
首先声明一点,database只能连接一个已存在的数据库,不能创建数据库 连接一个已存在的数据库步骤: 1,找到database:连续点击俩次shift,输入database就能找到了 2,点击绿色的 ...
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- npm install时 报错Maximum call stack size exceeded
给npm降级或者升级 降级 : npm install -g npm@5.4.0 升级 : npm install -g npm 升级到最新版