Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定

一放假就高产似母猪了。

00.混乱的前端界

Angular1.x确实是个学习成本很高的框架,刚开始实习那会儿,前端啥也不懂,工头说用Angular,我们这群小弟也只能硬着头皮学。在这之前,前端的东西大部分都用的jQuery,而Angular正好是和jQuery的思维是相反的,开发过程中遇到了不少坑。而Angular团队也放弃了1.x开始开发和React神似的2.0版本,唉,真是沧海桑田啊。

01.Angular vs jQuery

Angular模块化和解耦的思路确实值得一学,但是相对于成熟的jQuery插件库,Angular就显得寒酸了不少,比如,Angular-UI中日期控件是这样的:

丑的不要不要的,还不能选时间,相比之下jQuery就有很多优秀的控件了比如这样的:

此插件传送门:http://xdsoft.net/jqplugins/datetimepicker/

那么问题来了,控件一般是直接像这样$("#xx").val("xx")直接塞值进<input />标签的,这不会触发ng-change事件,ng-model也不会被更新,于是笔者写了个Angular适配指令,来实现这个控件的双向绑定,对于其他jQuery插件,也可以用类似的思路来进行适配。

10.干货

下面是一个Demo,比较两者的不同,注意右边ng-bind的属性使用adapter是会同步变化的↓

Demo传送门:http://ydxxwb.sinaapp.com/angularTimePicker/

Github地址:https://github.com/Code2Life/angular.DatetimePicker.git

angular.module("directives",[]).directive("datetimepicker",function(){
    return {
        restrict: "EA",   //指令作用范围是element或attribute
        require : "ngModel",  //控制器是指令标签对应的ngModel
        link: function (scope, element, attrs, ctrl) {

            var unregister = scope.$watch(function(){               //关键点,下面详述

                $(element).append("<input id=‘date-"+attrs.dateid+"‘ style=‘border:none;width:100%‘ value=‘"+ctrl.$modelValue+"‘>"); //template用不好,于是用这个笨办法加上input标签

                element.on(‘change‘, function() {  //注册onChange事件,设置viewValue
                    scope.$apply(function() {
                        ctrl.$setViewValue($("#date-"+attrs.dateid).val());
                    });
                });

                element.on(‘click‘,function(){    //click触发日期框
                    $("#date-"+attrs.dateid).datetimepicker({
                        format : attrs.format || ‘Y/m/d h:i‘,   //格式
                        onClose : function(){                   //关闭日期框时手动触发change事件
                            element.change();
                        }
                    });
                });

                element.click();        //第一次绑定事件,模拟一次click,否则肯能要点两下才会出日期框

                return ctrl.$modelValue;
            }, initialize);

            function initialize(value){  //下面再说
                ctrl.$setViewValue(value);
                unregister();
            }
        }
    }
});

写这个指令过程中遇到了一个大坑,查了很久才明白,Angular初始化一个ngModel的时候,是会先给它的value置为NaN,初始化必须要先调用$watch()来监测真正值被设置的时候,然后调用上面的initialize方法来设置view值。否则在Controller中设置的初始值会变成NaN。

11.不足之处

原插件是有很多可选项的,我只实现了一个最基本的format,有其他需求的自行改代码吧。可以利用第三个attrs参数获取属性,然后调用原插件的配置方法,来实现更复杂的逻辑。

时间: 2024-10-17 07:19:30

Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定的相关文章

自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选&amp;多选下拉框

先说点闲话,熟悉Angular的猿们会喜欢这个插件的. 00.本末倒置 不得不承认我是一个喜欢本末倒置的人,学生时代就喜欢先把晚交的作业先做,留着马上就要交的作业不做,然后慢悠悠做完不重要的作业,卧槽,XX作业马上要交了,赶紧补补补.如今做这个项目,因为没找到合适的多选下拉Web插件,又不想用html自带的丑陋的<select multiple></select>,自己花了一整天时间做了一个.或许这样占用的主要功能开发的时间,开发起来会更有紧迫感吧.感觉自己是个抖M自虐倾向,并且伴

开发路程(11): 日期时间选择器datetimepicker

在做项目中,往往会遇到需要用户输入2014-07-19 09:55:53这样的格式的数据.就是典型的年月日时分秒这样的格式.这个时候,使用datetimepicker会比较简单. DateTimePicket jQuery 插件:使用此插件非强制性地将 datetimepicker. datepicker 或 timepicker 下拉列表添加到您的窗体.就是这样.很好看吧. 添加jquery.datetimepicker和datetimepicker.css到您的页面: 1 <link rel

基于Bootstrup的jQuery日期时间选择器

bootstrap-datetimepicker是一款基于Bootstrup 3的超实用jQuery日期时间选择器.通过该插件你可以非常容易的创建很酷的bootstrup样式的日期时间选择器. 你也可以通过修改css文件来自定义它的样式. 该jQuery日期时间选择器的最小外部依赖需求是: jQuery Moment.js Bootstrap.js(如果你不想使用完整的bootstrup,至少需要transition 和collapse) Bootstrap Datepicker script

原生js日期时间插件鼠标点击文本框弹出日期时间表格选择日期时间

原文出处 (这是我从互联网上搜来的,感觉能满足各方面的需求.个人感觉挺不错的,所以后期修改了一下向大家推荐!) 效果图: html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org

angularjs封装bootstrap官网的时间插件datetimepicker

背景:angular与jquery类库的协作 第三方类库中,不得不提的是大名鼎鼎的jquery,现在基本上已经是国内web开发的必修工具了.它灵活的dom操作,让很多web开发人员欲罢不能.再加上已经很成熟的jquery UI 库和大量jquery 插件,几乎是一个取之不尽用之不竭的宝库.然而,它是否能与angularjs结合呢? 很多angularjs原教旨主义者对此持否定态度.他们认为,既然已经使用了angularjs做web应用框架,那就必须避免其他类库的干扰,做纯净的MvvM模式应用.任

dateTimePicker日期时间插件-----限定节假日调休的可选择性

需求:在项目中需要一款这样的日期插件,可以选择年月日,时分秒,对法定节假日不能选择,因法定节假日进行的调休可以选择: 现在使用的比较多的日期插件比如:Wdatepicker,jqueryUI的datepicker,都有周六天的限制选择,但是不能满足上述需求,所以在这里对jqUI的datepicker进行扩增,实现上述功能,并对IE8进行兼容处理,如图所示: 代码连接:https://github.com/ilikecandice/dateTimePicker/tree/master html部分

日期时间插件--日期时间组件文档 - layui.laydate

官方文档:http://www.layui.com/doc/modules/laydate.html 样式: <body> <div> <input placeholder="开始时间" id="LAY_start_time" name="startTime"type="text"readonly/> <input placeholder="截止时间" id=&qu

elementui 中 日期时间插件 结束时间大于开始时间

界面代码: <el-col :span="8"> <el-form-item label="开始日期" class="form-row-space"> <el-date-picker :picker-options="pickerOptionsStart" v-model="editDeviceGroup.start_date" type="date" pl

Angular指令与Jquery结合

 jQuery.fn.extend({ weekToInt : function(week){ if(week === 'Mon'){ return 1; }else if(week === 'Tue'){ return 2; }else if(week === 'Wed'){ return 3; }else if(week === 'Thu'){ return 4; }else if(week === 'Fri'){ return 5; }else if(week === 'Sat'){