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一些题目的解析
Dec 25 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
Mar 28 Javascript
php与js的区别是什么
Aug 05 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
May 20 Javascript
jQuery子元素过滤选择器用法示例
Sep 09 Javascript
vue-router 中router-view不能渲染的解决方法
May 23 Javascript
JavaScript利用fetch实现异步请求的方法实例
Jul 26 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
Vue实现todolist删除功能
Jun 26 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
详解python编译器和解释器的区别
2019/06/24 Python
python读写csv文件的方法
2019/08/13 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
Python request使用方法及问题总结
2020/04/26 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2014年绿化工作总结
2014/12/09 职场文书
大学学生会辞职信
2015/05/13 职场文书
docker-compose部署Yapi的方法
2022/04/08 Servers