本文介绍了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分页插件使用详解,有需要的朋友可以参考一下本文。