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 相关文章推荐
js的逻辑运算符 ||
May 31 Javascript
jquery 学习之二 属性相关
Nov 23 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 Javascript
不得不分享的JavaScript常用方法函数集(上)
Dec 23 Javascript
给easyui datebox扩展一个清空的实例
Nov 09 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
基于vue的换肤功能的示例代码
Oct 10 Javascript
webpack学习教程之前端性能优化总结
Dec 05 Javascript
查找Vue中下标的操作(some和findindex)
Aug 12 Javascript
详解ES6中class的实现原理
Oct 03 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中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP基本语法总结
2014/09/06 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
Bootstrap菜单按钮及导航实例解析
2016/09/09 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
详解Python中的type和object
2018/08/15 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
品恩科技软件测试面试题
2014/10/26 面试题
小班评语大全
2014/05/04 职场文书
安阳殷墟导游词
2015/02/10 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS