jQuery技术

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

字号+ 作者:H5之家 来源:H5之家 2017-03-08 09:00 我要评论( )

本文介绍了Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例。有兴趣的同学可以参考一下本文,非常实用。

本文介绍了Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例。有兴趣的同学可以参考一下本文,非常实用。

00.混乱的前端界

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

01.Angular vs jQuery

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

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

此插件传送门:

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

10.干货

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

Demo传送门:

 

 代码如下复制代码

angular.module("directives",[]).directive("datetimepicker",function(){

  return{

    restrict:"EA", //指令作用范围是element或attribute

    require :"ngModel",//控制器是指令标签对应的ngModel

    link:function(scope, element, attrs, ctrl) {

 

      varunregister = scope.$watch(function(){       //关键点,下面详述

 

        $(element).append("");

 //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,否则肯能要点两下才会出日期框

 

        returnctrl.$modelValue;

      }, initialize);

 

      functioninitialize(value){//下面再说

        ctrl.$setViewValue(value);

        unregister();

      }

    }

  }

});

 

写这个指令过程中遇到了一个大坑,查了很久才明白,Angular初始化一个ngModel的时候,是会先给它的value置为NaN,初始化必须要先调用$watch()来监测真正值被设置的时候,然后调用上面的initialize方法来设置view值。否则在Controller中设置的初始值会变成NaN。

11.不足之处

原插件是有很多可选项的,我只实现了一个最基本的format,有其他需求的自行改代码吧。可以利用第三个attrs参数获取属性,然后调用原插件的配置方法,来实现更复杂的逻辑。

没有了

这篇文章详细分析了jQuery加载及解析XML文件的方法,有兴趣的同学快来看看吧。

本文实例讲述了jQuery加载及解析XML文件的方法。分享给大家供大家参考,具体如下:

1、简述

XML(eXtensible Markup Language)即可扩展标记语言,与HTML一样,都是属于SGML标准通用语言。

2、 Content-Type

很多情况下XML文件不能正常解析都是由于Content-Type没有设置好。如果Content-Type本身就是一个XML文件则不需要设置;如果是由后台程序动态生成的,那么就需要设置Content-Type为“text/xml”,否则jQuery会以默认的“text/html”方式处理,导致解析失败。以下是几种常见语言中设置Content-Type的方式。

 代码如下 复制代码

header("Content-Type:text/xml");     //PHP
response.ContentType = "text/xml";   //ASP
response.setContentType("text/xm");  //JSP

3、创建实例XML文档(Student.xml)

 

 代码如下 复制代码

<?xmlversion="1.0"encoding="utf-8"?>

<stulist>

 <studentemail="peter@163.com">

  <name>peter</name>

  <id>1</id>

 </student>

 <studentemail="ken@163.com">

  <name>ken</name>

  <id>2</id>

 </student>

</stulist>

 

4、获取XML

 

 代码如下 复制代码

$(document).ready(function() {

  $.ajax({

    url:'/xml/Student.xml',

    type:'GET',

    dataType:'xml',

    timeout: 1000,//设定超时

    cache:false, //禁用缓存

    error:function(xml) {

      alert("加载XML文档出错!");

    },

    success: GetStudentComplete //设置成功后回调函数

  });

});

 

通过JQuery的Ajax函数进行读取。

5、 解释XML

 

 代码如下 复制代码

//获取XML成功后回调函数

functionGetStudentComplete(xml) {

  $(xml).find("student").each(function(i) {  //查找所有student节点并遍历

    varid = $(this).children("id");    //获得子节点

    varid_vaule = id.text();        //获取节点文本

    varemail_vaule = $(this).attr("email");//获取节点的属性

    alert(id_vaule);

    alert(email_vaule);

  });

}

 

没有了

本文详细解析了select下拉框插件jquery.editable-select,初学jquery,有不懂的同学快来看看这篇文章吧。

项目中有个需求,下拉框既可以下拉选择,也可以手动填写

html代码

 代码如下 复制代码

<span>数据来源</span>

<selectclass="source">

<optionvalue="0">人工导入</option>

<optionvalue="1">数据服务平台</option>

</select>

js代码

 代码如下 复制代码

$('#noMean').editableSelect({

 filter:false,

 effects:'fade',

 duration: 200,

 onCreate:function() {

 console.log("下拉框创建")

 },

 onShow:function() {

 console.log("下拉框显示")

 },

 onHide:function() {

 console.log("下拉框隐藏")

 },

 onSelect:function() {

 console.log("下拉框选项被选中")

 }

 }

获取值

$(".noMean").val()

用了这个插件以后,这块是一个input,type="text"

参数

filter  选择option以后,是否过滤  默认 true

effects  点击的时候,下拉框的过渡效果  有default,slide,fade三个值,默认是default

duration  过渡效果时间  默认是fast  值可以是fast和slow,也可以是数字

appendTo  下拉框如果弹出框效果,这个值才会用到,显示把它加载到哪里

trigger  下拉框列表如何触发 值是"focus", "manual"  默认是focus

方法

onCreate:当editableSelect方法生效时触发。

onShow:当下拉框出现时触发。

onHide:当下拉框隐藏时触发。

onSelect:当下拉框中的选项被选中时触发。

没有了

jquery pagination分页插件怎么用?这篇文章介绍了jquery pagination分页插件使用详解,有需要的朋友可以参考一下本文。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • AngularJS压缩JS的操作技巧分析

    AngularJS压缩JS的操作技巧分析

    2017-02-15 15:02

  • web前端、css、html、jquery、jqm、js、angular、recat

    web前端、css、html、jquery、jqm、js、angular、recat

    2016-10-17 16:05

  • ← js封装一个tab效果页面无刷新ajax下传文件–模拟iframe,超简单 →JQuery IFrame框架高度自适

    ← js封装一个tab效果页面无刷新ajax下传文件–模拟iframe,超简单

    2016-04-28 15:00

  • 从JQuery到Angular的一次改版 // 亚里士朱德的博客

    从JQuery到Angular的一次改版 // 亚里士朱德的博客

    2015-11-15 15:09

网友点评