前言

上一篇我们说了下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. java 复习总结

    java 复习总结 命名方法 创建文件的名称应该和类的名称一致,不然会报错. 类采用首字母大写的方式来命名,如果是多个单词的类名,则每个单词首字母都大写,例如:HelloWorld . 方法采用驼峰命 ...

  2. P4313 文理分科 最小割

    $ \color{#0066ff}{ 题目描述 }$ 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...

  3. PHP批量给目录下所有的文件转换编码

    代码如下: function tree(&$arr_file, $directory, $dir_name=''){            $mydir = dir($directory);  ...

  4. AR资料汇总学习

    ARKit 从入门到精通 http://www.chinaar.com/ARKit/5210.html ARKit 框架的学习 http://blog.csdn.net/biangabiang/art ...

  5. 自己写的一个ASP.NET服务器控件Repeater和GridView分页类

    不墨迹,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  6. 【转】IDEA快捷键功能说明及Eclipse对应操作

    1.Ctrl+z是撤销快捷键 2.如果想恢复Ctrl+z 掉的内容,按快捷键为:Ctrl + Shift + Z.方可 3.Ctrl-H(Browse Type Hierarchy) Ctrl + A ...

  7. Flask之flask_script

    flask端口占用 解决方案: lsof -i:5000 #查询是哪个进程占用的 kill PID 杀掉进程 flask_script之Manager类 from flask import Flask ...

  8. 【第一周】 网络爬虫之规则 北京理工大学嵩天 mooc

    rrequests库的7个主要方法 方法 说明 requests.request() 构造一个请求,支撑以下各方法的基础方法 requests.get() 获取HTML网页的主要方法,对应于HTTP的 ...

  9. Python web前端 03 CSS属性

    Python web前端 03 CSS属性 一.文字.文本属性 1.文字属性 font-family #字体类型浏览器默认的字体是微软雅黑,字体中有多个字体的时候,如果前面的字体没有就使用后面的字体 ...

  10. ES6,CommonJS 区别

    Javascript,javascript是一种脚本编程语言,有自己独立的语法与语义,没有javascript,也就没有其他的那些概念了. 关于ES6,可直接理解为javascript的增强版(增加了 ...