前言

上一篇我们说了下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实现日期联动的更多相关文章

  1. jQuery日期联动插件

    此版本为网上的日期联动插件修改版,加入了修改后事件 /* * jQuery Date Selector Plugin * 日期联动选择插件 * * Demo: $("#calendar&qu ...

  2. JS Select 月日日期联动

    Js对Select控件进行联动操作,一个select选择月份后另一个select生成对应月份的所有日期. <%@ Page Language="C#" AutoEventWi ...

  3. 生日日期联动选择birthday.js

    实例下载

  4. JS年月日三级联动下拉框日期选择代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. html年月日下拉联动菜单 年月日三下拉框联动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 纯javascript联动的例子

    有人想要学习下纯javascript联动的一些技巧,我这里就以日期的联动为例,附上一些代码至于复杂的省市区联动,不建议用纯javascript的,而是用ajax的方式,该不在此讨论范围内,想要了解aj ...

  7. JS实现年月日三级联动+省市区三级联动+国家省市三级联动

    开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...

  8. js修改日期

    需求说明: (1)首先是input显示年月日时分格式时间,其中年月日实在本地时间基础上,加上后面联动值.小时默认08:00不变 (2)后面input内显示天数,右侧加减按钮,控制天数,天数确定后,前面 ...

  9. js实现年月日三级联动

    当我们注册一个qq的时候,会看到一个三级年月日的联动菜单,下面简单介绍. <!doctype html> <html lang="en"> <head ...

随机推荐

  1. 《C#多线程编程实战》1.10 lock关键字

    lock关键字是锁定资源用的. 书上的代码解释很好. /// <summary> /// 抽象类 加减法 /// </summary> abstract class Count ...

  2. SpringBoot+MyBatis+MySQL读写分离(实例)

    ​ 1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是 ...

  3. ES更改参数max_result_window

    今天开发那边说翻页超过10000报错.早上来查阅官网手册,说from/size默认是10000.通过参数index.max_result_window进行控制.那么直接改这个参数即可. 1.先看看默认 ...

  4. 【BZOJ3589】动态树 树链剖分+线段树

    Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你 ...

  5. luoguP4172 [WC2006]水管局长

    https://www.luogu.org/problemnew/show/P4172 考虑倒序处理所有操作 先把不会被删掉的边加入图中,LCT 维护最小生成树,再倒序插入每一条边,如果边的 ( l, ...

  6. Java的引用和C++的指针de区别

    Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别. (1)类型:引用其值 ...

  7. [jvm]基于jvm的线程实现

    一.线程的实现 学过操作系统的肯定都知道: 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位. 线程:是进程的一个执行单元,是进程内可调度实体. ...

  8. 最小圆覆盖 [模板] BZOJ 1337&1336

    题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入输出格式 输入格式: 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi& ...

  9. 包括ES6在内的数组操作(待更)

    下面是我对ES6和古老的JS(ES3)一些数组操作的总结,附带了一些我曾经用上的. map处有待更内容. 贴一下有借鉴的网站:https://segmentfault.com/a/1190000002 ...

  10. POJ_3262 Protecting the Flowers 【贪心】

    一.题面 POJ3262 二.分析 这题要往贪心上面想应该还是很容易的,但问题是要证明为什么比值关系就能满足. 可以选择几个去分析,入1-6  与 2-15  和 1-6 与2-5 和 1-6 与 2 ...