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 相关文章推荐
用JavaScript脚本实现Web页面信息交互
Dec 21 Javascript
JavaScript中的细节分析
Jun 30 Javascript
这些年、我收集的JQuery代码小结
Aug 01 Javascript
jquery 插件学习(六)
Aug 06 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
Sep 05 Javascript
Javascript面试经典套路reduce函数查重
Mar 23 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
小程序中this.setData的使用和注意事项
Aug 28 Javascript
微信提示 在浏览器打开 效果实现过程解析
Sep 10 Javascript
prettier自动格式化去换行的实现代码
Aug 25 Javascript
video.js添加自定义组件的方法
Dec 09 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php 购物车实例(申精)
2009/05/11 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
Javascript实现字数统计
2015/07/03 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python中xrange和range的区别
2014/05/13 Python
Python字符串格式化输出方法分析
2016/04/13 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
django框架使用方法详解
2019/07/18 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
党员活动日总结
2014/05/05 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
离婚被告代理词
2015/05/23 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书