最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年01月22日 16:35:37   作者:Code2Life  
這篇文章主要介紹了Angular指令封裝jQuery日期時(shí)間插件datetimepicker實(shí)現(xiàn)雙向綁定示例,具有一定的參考價(jià)值,有興趣的可以了解一下。

00.混亂的前端界

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

01.Angular vs jQuery

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

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

此插件傳送門:http://xdsoft.net/jqplugins/datetimepicker/

那么問題來了,控件一般是直接像這樣$("#xx").val("xx")直接塞值進(jìn)<input />標(biāo)簽的,這不會(huì)觸發(fā)ng-change事件,ng-model也不會(huì)被更新,于是筆者寫了個(gè)Angular適配指令,來實(shí)現(xiàn)這個(gè)控件的雙向綁定,對(duì)于其他jQuery插件,也可以用類似的思路來進(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){ //下面再說
        ctrl.$setViewValue(value);
        unregister();
      }
    }
  }
});

寫這個(gè)指令過程中遇到了一個(gè)大坑,查了很久才明白,Angular初始化一個(gè)ngModel的時(shí)候,是會(huì)先給它的value置為NaN,初始化必須要先調(diào)用$watch()來監(jiān)測(cè)真正值被設(shè)置的時(shí)候,然后調(diào)用上面的initialize方法來設(shè)置view值。否則在Controller中設(shè)置的初始值會(huì)變成NaN。

11.不足之處

原插件是有很多可選項(xiàng)的,我只實(shí)現(xiàn)了一個(gè)最基本的format,有其他需求的自行改代碼吧??梢岳玫谌齻€(gè)attrs參數(shù)獲取屬性,然后調(diào)用原插件的配置方法,來實(shí)現(xiàn)更復(fù)雜的邏輯。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

永新县| 中方县| 剑川县| 华容县| 固始县| 和林格尔县| 浦北县| 景德镇市| 尖扎县| 洮南市| 华蓥市| 台南市| 章丘市| 阿拉善左旗| 景宁| 沁水县| 安福县| 平陆县| 安平县| 闸北区| 新平| 西乌珠穆沁旗| 若尔盖县| 井陉县| 灵石县| 嵩明县| 佛坪县| 札达县| 湟源县| 玉树县| 宁陵县| 富川| 新晃| 五莲县| 内乡县| 平凉市| 遵义县| 盐亭县| 大城县| 苍梧县| 黑河市|