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 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
Apr 11 Javascript
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
常用DOM整理
Jun 16 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
Mar 01 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 Javascript
Typescript类型系统FLOW静态检查基本规范
May 25 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
php strcmp使用说明
2010/04/22 PHP
深入php self与$this的详解
2013/06/08 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
javascript截取字符串小结
2015/04/28 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
python魔法方法-属性访问控制详解
2016/07/25 Python
python paramiko模块学习分享
2017/08/23 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Python字符串的修改方法实例
2019/12/19 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python之随机数函数的实现示例
2020/12/30 Python
初三政治教学反思
2014/01/30 职场文书
小学数学国培感言
2014/03/10 职场文书
教学质量评估实施方案
2014/03/17 职场文书
个人思想政治总结
2015/03/05 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫