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 相关文章推荐
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
jQuery DOM操作实例
Mar 05 Javascript
Angular Js文件上传之form-data
Aug 28 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
JavaScript中的闭包
Feb 24 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
解决vue-router 切换tab标签关闭时缓存问题
Jul 22 Javascript
关于JavaScript回调函数的深入理解
Jun 27 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
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
js表数据排序 sort table data
2009/02/18 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
web.js.字符串与正则表达式操作
2017/05/13 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python3.5仿微软计算器程序
2020/03/30 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
详解python tcp编程
2020/08/24 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
毕业生求职推荐信
2013/11/04 职场文书
电子商务应届生求职信
2013/11/16 职场文书
书法培训心得体会
2014/01/05 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
元宵节主持词
2014/03/25 职场文书
常务副总经理任命书
2014/06/05 职场文书
叶问观后感
2015/06/15 职场文书
导游词之井冈山
2019/11/20 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
JavaScript实现登录窗体
2021/06/22 Javascript