Angular指令封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定示例
00.混亂的前端界
Angular1.x確實(shí)是個(gè)學(xué)習(xí)成本很高的框架,剛開始實(shí)習(xí)那會(huì)兒,前端啥也不懂,工頭說(shuō)用Angular,我們這群小弟也只能硬著頭皮學(xué)。在這之前,前端的東西大部分都用的jQuery,而Angular正好是和jQuery的思維是相反的,開發(fā)過(guò)程中遇到了不少坑。而Angular團(tuán)隊(duì)也放棄了1.x開始開發(fā)和React神似的2.0版本,唉,真是滄海桑田啊。
01.Angular vs jQuery
Angular模塊化和解耦的思路確實(shí)值得一學(xué),但是相對(duì)于成熟的jQuery插件庫(kù),Angular就顯得寒酸了不少,比如,Angular-UI中日期控件是這樣的:

丑的不要不要的,還不能選時(shí)間,相比之下jQuery就有很多優(yōu)秀的控件了比如這樣的:

此插件傳送門:http://xdsoft.net/jqplugins/datetimepicker/
那么問(wèn)題來(lái)了,控件一般是直接像這樣$("#xx").val("xx")直接塞值進(jìn)<input />標(biāo)簽的,這不會(huì)觸發(fā)ng-change事件,ng-model也不會(huì)被更新,于是筆者寫了個(gè)Angular適配指令,來(lái)實(shí)現(xiàn)這個(gè)控件的雙向綁定,對(duì)于其他jQuery插件,也可以用類似的思路來(lái)進(jìn)行適配。
10.干貨
下面是一個(gè)Demo,比較兩者的不同,注意右邊ng-bind的屬性使用adapter是會(huì)同步變化的↓
Demo傳送門:http://xiazai.jb51.net/201701/yuanma/angular.DatetimePicker_jb51.rar
angular.module("directives",[]).directive("datetimepicker",function(){
return {
restrict: "EA", //指令作用范圍是element或attribute
require : "ngModel", //控制器是指令標(biāo)簽對(duì)應(yīng)的ngModel
link: function (scope, element, attrs, ctrl) {
var unregister = scope.$watch(function(){ //關(guān)鍵點(diǎn),下面詳述
$(element).append("<input id='date-"+attrs.dateid+"' style='border:none;width:100%' value='"+ctrl.$modelValue+"'>");
//template用不好,于是用這個(gè)笨辦法加上input標(biāo)簽
element.on('change', function() { //注冊(cè)onChange事件,設(shè)置viewValue
scope.$apply(function() {
ctrl.$setViewValue($("#date-"+attrs.dateid).val());
});
});
element.on('click',function(){ //click觸發(fā)日期框
$("#date-"+attrs.dateid).datetimepicker({
format : attrs.format || 'Y/m/d h:i', //格式
onClose : function(){ //關(guān)閉日期框時(shí)手動(dòng)觸發(fā)change事件
element.change();
}
});
});
element.click(); //第一次綁定事件,模擬一次click,否則肯能要點(diǎn)兩下才會(huì)出日期框
return ctrl.$modelValue;
}, initialize);
function initialize(value){ //下面再說(shuō)
ctrl.$setViewValue(value);
unregister();
}
}
}
});
寫這個(gè)指令過(guò)程中遇到了一個(gè)大坑,查了很久才明白,Angular初始化一個(gè)ngModel的時(shí)候,是會(huì)先給它的value置為NaN,初始化必須要先調(diào)用$watch()來(lái)監(jiān)測(cè)真正值被設(shè)置的時(shí)候,然后調(diào)用上面的initialize方法來(lái)設(shè)置view值。否則在Controller中設(shè)置的初始值會(huì)變成NaN。
11.不足之處
原插件是有很多可選項(xiàng)的,我只實(shí)現(xiàn)了一個(gè)最基本的format,有其他需求的自行改代碼吧。可以利用第三個(gè)attrs參數(shù)獲取屬性,然后調(diào)用原插件的配置方法,來(lái)實(shí)現(xiàn)更復(fù)雜的邏輯。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Json2Template.js 基于jquery的插件 綁定JavaScript對(duì)象到Html模板中
- 一個(gè)可綁定數(shù)據(jù)源的jQuery數(shù)據(jù)表格插件
- Jquery 模板數(shù)據(jù)綁定插件的使用方法詳解
- jquery彈窗插件colorbox綁定動(dòng)態(tài)生成元素的方法
- Vue.js列表渲染綁定jQuery插件的正確姿勢(shì)
- jQuery給動(dòng)態(tài)添加的元素綁定事件的方法
- jquery移除、綁定、觸發(fā)元素事件使用示例詳解
- JQuery中綁定事件(bind())和移除事件(unbind())
- jQuery事件的綁定、觸發(fā)、及監(jiān)聽(tīng)方法簡(jiǎn)單說(shuō)明
- jQuery事件綁定和委托實(shí)例
- jQuery事件綁定on()、bind()與delegate() 方法詳解
- jquery 插件重新綁定的處理方法分析
相關(guān)文章
AngularJS ionic手勢(shì)事件的使用總結(jié)
本篇文章主要介紹了AngularJS手勢(shì)事件的使用總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
AngularJS實(shí)現(xiàn)的生成隨機(jī)數(shù)與猜數(shù)字大小功能示例
這篇文章主要介紹了AngularJS實(shí)現(xiàn)的生成隨機(jī)數(shù)與猜數(shù)字大小功能,結(jié)合完整實(shí)例形式分析了AngularJS隨機(jī)數(shù)生成與數(shù)值判定相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
AngularJS實(shí)現(xiàn)頁(yè)面定時(shí)刷新
本篇文章主要介紹了AngularJS實(shí)現(xiàn)頁(yè)面定時(shí)刷新,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
詳解angularjs結(jié)合pagination插件實(shí)現(xiàn)分頁(yè)功能
本篇文章主要介紹了詳解angularjs結(jié)合pagination插件實(shí)現(xiàn)分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
如何在Angular8.0下使用ngx-translate進(jìn)行國(guó)際化配置
這篇文章主要介紹了如何在Angular8.0下使用ngx-translate進(jìn)行國(guó)際化配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
詳解AngularJS跨頁(yè)面?zhèn)髦担╱i-router)
本篇文章主要介紹了詳解AngularJS跨頁(yè)面?zhèn)髦担╱i-router),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
舉例詳解AngularJS中ngShow和ngHide的使用方法
這篇文章主要介紹了舉例詳解AngularJS中ngShow和ngHide的使用方法,AngularJS是一款非常熱門的JavaScript框架,需要的朋友可以參考下2015-06-06

