Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例

发布时间 - 2026-01-10 22:44:15    点击率:

00.混乱的前端界

Angular1.x确实是个学习成本很高的框架,刚开始实习那会儿,前端啥也不懂,工头说用Angular,我们这群小弟也只能硬着头皮学。在这之前,前端的东西大部分都用的jQuery,而Angular正好是和jQuery的思维是相反的,开发过程中遇到了不少坑。而Angular团队也放弃了1.x开始开发和React神似的2.0版本,唉,真是沧海桑田啊。

01.Angular vs jQuery

Angular模块化和解耦的思路确实值得一学,但是相对于成熟的jQuery插件库,Angular就显得寒酸了不少,比如,Angular-UI中日期控件是这样的:

丑的不要不要的,还不能选时间,相比之下jQuery就有很多优秀的控件了比如这样的:

此插件传送门:http://xdsoft.net/jqplugins/datetimepicker/

那么问题来了,控件一般是直接像这样$("#xx").val("xx")直接塞值进<input />标签的,这不会触发ng-change事件,ng-model也不会被更新,于是笔者写了个Angular适配指令,来实现这个控件的双向绑定,对于其他jQuery插件,也可以用类似的思路来进行适配。

10.干货

下面是一个Demo,比较两者的不同,注意右边ng-bind的属性使用adapter是会同步变化的↓

Demo传送门:http://xiazai./201701/yuanma/angular.DatetimePicker_jb51.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参数获取属性,然后调用原插件的配置方法,来实现更复杂的逻辑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Angular  # datetimepicker  # 时间插件  # jQuery  # Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板  # 一个可绑定数据源的jQuery数据表格插件  # Jquery 模板数据绑定插件的使用方法详解  # jquery弹窗插件colorbox绑定动态生成元素的方法  # Vue.js列表渲染绑定jQuery插件的正确姿势  # jQuery给动态添加的元素绑定事件的方法  # jquery移除、绑定、触发元素事件使用示例详解  # JQuery中绑定事件(bind())和移除事件(unbind())  # jQuery事件的绑定、触发、及监听方法简单说明  # jQuery事件绑定和委托实例  # jQuery事件绑定on()、bind()与delegate() 方法详解  # jquery 插件重新绑定的处理方法分析  # 来实现  # 绑定  # 过程中  # 是一个  # 传送门  # 是个  # 来了  # 是有  # 就有  # 在这  # 是这样  # 我只  # 才会  # 可以用  # 不懂  # 很久  # 很高  # 写了  # 刚开始  # 沧海桑田 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  详解vue.js组件化开发实践  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Python正则表达式进阶教程_复杂匹配与分组替换解析  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  WEB开发之注册页面验证码倒计时代码的实现  Laravel distinct去重查询_Laravel Eloquent去重方法  微信小程序 require机制详解及实例代码  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  如何获取PHP WAP自助建站系统源码?  Swift开发中switch语句值绑定模式  如何在云主机快速搭建网站站点?  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Linux安全能力提升路径_长期防护思维说明【指导】  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  java获取注册ip实例  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  如何快速搭建个人网站并优化SEO?  Laravel如何使用查询构建器?(Query Builder高级用法)  js实现获取鼠标当前的位置  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  EditPlus中的正则表达式 实战(4)  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  如何在建站之星网店版论坛获取技术支持?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  微信小程序 input输入框控件详解及实例(多种示例)  Android Socket接口实现即时通讯实例代码  如何在万网自助建站平台快速创建网站?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何生成URL和重定向?(路由助手函数)  Laravel如何发送系统通知?(Notification渠道示例)  Python进程池调度策略_任务分发说明【指导】  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  移动端脚本框架Hammer.js  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速查询网址的建站时间与历史轨迹?  jquery插件bootstrapValidator表单验证详解  JS经典正则表达式笔试题汇总  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何破解联通资金短缺导致的基站建设难题?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  打造顶配客厅影院,这份100寸电视推荐名单请查收  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?