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 相关文章推荐
页面中iframe相互传值传参
Dec 13 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
网页中CDATA标记的说明
Sep 12 Javascript
jQuery hover 延时器实现代码
Mar 12 Javascript
JS实现的另类手风琴效果网页内容切换代码
Sep 08 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
详解使用jQuery.i18n.properties实现js国际化
May 04 jQuery
Vue.js实现数据响应的方法
Aug 13 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
Vue computed 计算属性代码实例
Apr 22 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 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
简单实现PHP留言板功能
2016/12/21 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
json 入门基础教程 推荐
2009/10/31 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
python self,cls,decorator的理解
2009/07/13 Python
python类型强制转换long to int的代码
2013/02/10 Python
python基础之入门必看操作
2017/07/26 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
python Scrapy框架原理解析
2021/01/04 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
介绍一下如何优化MySql
2016/12/20 面试题
Hibernate持久层技术
2013/12/16 面试题
节约用水演讲稿
2014/05/21 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS