Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定

這篇文章給大家分享的是有關(guān)Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)建站技術(shù)團(tuán)隊(duì)10多年來(lái)致力于為客戶(hù)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站設(shè)計(jì)成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了上1000+網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

00.混亂的前端界

Angular1.x確實(shí)是個(gè)學(xué)習(xí)成本很高的框架,剛開(kāi)始實(shí)習(xí)那會(huì)兒,前端啥也不懂,工頭說(shuō)用Angular,我們這群小弟也只能硬著頭皮學(xué)。在這之前,前端的東西大部分都用的jQuery,而Angular正好是和jQuery的思維是相反的,開(kāi)發(fā)過(guò)程中遇到了不少坑。而Angular團(tuán)隊(duì)也放棄了1.x開(kāi)始開(kāi)發(fā)和React神似的2.0版本,唉,真是滄海桑田啊。

01.Angular vs jQuery

Angular模塊化和解耦的思路確實(shí)值得一學(xué),但是相對(duì)于成熟的jQuery插件庫(kù),Angular就顯得寒酸了不少,比如,Angular-UI中日期控件是這樣的:

Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定

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

Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定

此插件傳送門(mén):http://xdsoft.net/jqplugins/datetimepicker/

那么問(wèn)題來(lái)了,控件一般是直接像這樣$("#xx").val("xx")直接塞值進(jìn)<input />標(biāo)簽的,這不會(huì)觸發(fā)ng-change事件,ng-model也不會(huì)被更新,于是筆者寫(xiě)了個(gè)Angular適配指令,來(lái)實(shí)現(xiàn)這個(gè)控件的雙向綁定,對(duì)于其他jQuery插件,也可以用類(lèi)似的思路來(lái)進(jìn)行適配。

10.干貨

下面是一個(gè)Demo,比較兩者的不同,注意右邊ng-bind的屬性使用adapter是會(huì)同步變化的↓

Demo傳送門(mén):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();
      }
    }
  }
});

寫(xiě)這個(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ù)雜的邏輯。

感謝各位的閱讀!關(guān)于“Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

新聞標(biāo)題:Angular指令如何封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定
網(wǎng)頁(yè)URL:http://muchs.cn/article30/pdpdpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作企業(yè)建站、標(biāo)簽優(yōu)化品牌網(wǎng)站制作、定制網(wǎng)站電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)