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数组
May 11 Javascript
js open() 与showModalDialog()方法使用介绍
Sep 10 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
EasyUI中在表单提交之前进行验证
Jul 19 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 Javascript
浅析前端路由简介以及vue-router实现原理
Jun 01 Javascript
从vue源码解析Vue.set()和this.$set()
Aug 30 Javascript
vue动态子组件的两种实现方式
Sep 01 Javascript
javascript canvas时钟模拟器
Jul 13 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简单静态页生成过程
2008/03/27 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
python如何把字符串类型list转换成list
2020/02/18 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
绿色小区申报材料
2014/08/22 职场文书
教师节标语大全
2014/10/07 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
Python Socket编程详解
2021/04/25 Python