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


Posted in Javascript onJanuary 22, 2017

00.混乱的前端界

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

01.Angular vs jQuery

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

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

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

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

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

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

10.干货

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

Demo传送门:http://xiazai.3water.com/201701/yuanma/angular.DatetimePicker_3water.rar

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参数获取属性,然后调用原插件的配置方法,来实现更复杂的逻辑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
直接生成打开窗口代码,不必下载
May 14 Javascript
jquery text()要注意啦
Oct 30 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
详解JavaScript中的Unescape()和String() 函数
Nov 09 Javascript
Bootstrap整体框架之JavaScript插件架构
Dec 15 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
express express-session的使用小结
Dec 12 Javascript
使用layer弹窗,制作编辑User信息页面的方法
Sep 27 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
html实现随机点名器的示例代码
Apr 02 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 #Javascript
JavaScript 详解预编译原理
Jan 22 #Javascript
JavaScript中匿名函数的递归调用
Jan 22 #Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 #Javascript
loading动画特效小结
Jan 22 #Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 #Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 #Javascript
You might like
7个超级实用的PHP代码片段
2011/07/11 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
Python实现备份文件实例
2014/09/16 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
python实现五子棋人机对战游戏
2020/03/25 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
外企测试工程师面试题
2015/02/01 面试题
白酒营销策划方案
2014/08/17 职场文书
协议书范文
2015/01/27 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
阿甘正传观后感
2015/06/01 职场文书
《桂花雨》教学反思
2016/02/19 职场文书