Angularjs中使用layDate日期控件示例
layDate 控件地址:http://laydate.layui.com/
前情:原來系統(tǒng)中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/bootstrap/)里的。后來因?yàn)楦鞣N原因,要換掉UI bootstrap中的日期控件,改用layDate日期控件。
解決思路:將layDate的初始化及相關(guān)代碼定義在指令里。
問題關(guān)鍵點(diǎn):layDate操作的是Html元素的,怎么實(shí)現(xiàn)雙向綁定,同步Angularjs模板值和Html的元素值。
指令具體代碼:
/** * 使用示例 * <input def-laydate type="text" id="id1" ng-model="startTime"/> */ app .directive('defLaydate', function() { return { require: '?ngModel', restrict: 'A', scope: { ngModel: '=' }, link: function(scope, element, attr, ngModel) { var _date = null,_config={}; // 初始化參數(shù) _config = { elem: '#' + attr.id, format: attr.format != undefined && attr.format != '' ? attr.format : 'YYYY-MM-DD', max:attr.hasOwnProperty('maxDate')?attr.maxDate:'', min:attr.hasOwnProperty('minDate')?attr.minDate:'', choose: function(data) { scope.$apply(setViewValue); }, clear:function(){ ngModel.$setViewValue(null); } }; // 初始化 _date= laydate(_config); // 模型值同步到視圖上 ngModel.$render = function() { element.val(ngModel.$viewValue || ''); }; // 監(jiān)聽元素上的事件 element.on('blur keyup change', function() { scope.$apply(setViewValue); }); setViewValue(); // 更新模型上的視圖值 function setViewValue() { var val = element.val(); ngModel.$setViewValue(val); } } } })
---以上代碼使用示例為 <input def-laydate type="text" id="id1" ng-model="startTime"/>
注意:1.指令只能用做元素屬性。2.元素必須要有唯一id屬性。
到此為止,在Angularjs里使用laydate的基本目標(biāo)實(shí)現(xiàn)了。但是,日期組件難免會(huì)有日期選擇范圍限制的要求,比如日期可選的最大值,最小值?,F(xiàn)對指令做優(yōu)化以滿足要求:
app.directive('defLaydate', function() { return { require: '?ngModel', restrict: 'A', scope: { ngModel: '=', maxDate:'@', minDate:'@' }, link: function(scope, element, attr, ngModel) { var _date = null,_config={}; // 初始化參數(shù) _config = { elem: '#' + attr.id, format: attr.format != undefined && attr.format != '' ? attr.format : 'YYYY-MM-DD', max:attr.hasOwnProperty('maxDate')?attr.maxDate:'', min:attr.hasOwnProperty('minDate')?attr.minDate:'', choose: function(data) { scope.$apply(setViewValue); }, clear:function(){ ngModel.$setViewValue(null); } }; // 初始化 _date= laydate(_config); // 監(jiān)聽日期最大值 if(attr.hasOwnProperty('maxDate')){ attr.$observe('maxDate', function (val) { _config.max = val; }) } // 監(jiān)聽日期最小值 if(attr.hasOwnProperty('minDate')){ attr.$observe('minDate', function (val) { _config.min = val; }) } // 模型值同步到視圖上 ngModel.$render = function() { element.val(ngModel.$viewValue || ''); }; // 監(jiān)聽元素上的事件 element.on('blur keyup change', function() { scope.$apply(setViewValue); }); setViewValue(); // 更新模型上的視圖值 function setViewValue() { var val = element.val(); ngModel.$setViewValue(val); } } } })
---以上代碼使用示例為 <input def-laydate type="text" id="id1" ng-model="startTime" max-date="{{model.max}}" min-date="{{model.min}}"/> min-date,max-date屬性按需添加。
這樣的指令一般情況下已經(jīng)可以滿足使用,但是在結(jié)合ngDialog使用時(shí)出現(xiàn)了問題:layDate在初始化中g(shù)etElementById 獲取元素時(shí),彈窗中的html內(nèi)容還沒有持到頁面的結(jié)點(diǎn)樹中,故而報(bào)錯(cuò)。
于是希望指令的link代碼可以在彈窗渲染后再執(zhí)行,查找資料后,在指令中引入了$timeout:
app.directive('ngcLayDate', function($timeout) { return { require: '?ngModel', restrict: 'A', scope: { ngModel: '=', maxDate:'@', minDate:'@' }, link: function(scope, element, attr, ngModel) { var _date = null,_config={}; // 渲染模板完成后執(zhí)行 $timeout(function(){ // 初始化參數(shù) _config = { elem: '#' + attr.id, format: attr.format != undefined && attr.format != '' ? attr.format : 'YYYY-MM-DD', max:attr.hasOwnProperty('maxDate')?attr.maxDate:'', min:attr.hasOwnProperty('minDate')?attr.minDate:'', choose: function(data) { scope.$apply(setViewValue); }, clear:function(){ ngModel.$setViewValue(null); } }; // 初始化 _date= laydate(_config); // 監(jiān)聽日期最大值 if(attr.hasOwnProperty('maxDate')){ attr.$observe('maxDate', function (val) { _config.max = val; }) } // 監(jiān)聽日期最小值 if(attr.hasOwnProperty('minDate')){ attr.$observe('minDate', function (val) { _config.min = val; }) } // 模型值同步到視圖上 ngModel.$render = function() { element.val(ngModel.$viewValue || ''); }; // 監(jiān)聽元素上的事件 element.on('blur keyup change', function() { scope.$apply(setViewValue); }); setViewValue(); // 更新模型上的視圖值 function setViewValue() { var val = element.val(); ngModel.$setViewValue(val); } },0); } }; })
OK,問題解決。解決問題的過程伴隨著查資料的過程,是一步步完善的。也希望大家在遇到同樣的問題時(shí)少走彎路
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- layDate插件設(shè)置開始和結(jié)束時(shí)間
- layDate日期控件使用方法詳解
- laydate時(shí)間日歷插件使用方法詳解
- vue使用laydate時(shí)間插件的方法
- 詳解easyui基于 layui.laydate日期擴(kuò)展組件
- 關(guān)于laydate.js加載laydate.css路徑錯(cuò)誤問題解決
- Angular4.0中引入laydate.js日期插件的方法教程
- laydate日歷控件使用方法詳解
- laydate 顯示結(jié)束時(shí)間不小于開始時(shí)間的實(shí)例
- Bootstrap.css與layDate日期選擇樣式起沖突的解決辦法
- laydate.js日期時(shí)間選擇插件
- bootstrap laydate日期組件使用詳解
- Laydate時(shí)間組件在火狐瀏覽器下有多時(shí)間輸入框時(shí)只能給第一個(gè)輸入框賦值的解決方法
- laydate如何根據(jù)開始時(shí)間或者結(jié)束時(shí)間限制范圍
相關(guān)文章
angular 服務(wù)的單例模式(依賴注入模式下)詳解
這篇文章主要介紹了angular 服務(wù)的單例模式(依賴注入模式下)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10AngularJS自定義指令之復(fù)制指令實(shí)現(xiàn)方法
這篇文章主要介紹了AngularJS自定義指令之復(fù)制指令實(shí)現(xiàn)方法,結(jié)合完整實(shí)例形式分析了AngularJS自定義指令實(shí)現(xiàn)復(fù)制功能的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Angular使用$http.jsonp發(fā)送跨站請求的方法
這篇文章主要介紹了Angular使用$http.jsonp發(fā)送跨站請求的方法,結(jié)合實(shí)例形式分析了$http.jsonp發(fā)送跨站請求遇到的問題與相應(yīng)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Angular應(yīng)用prerender預(yù)渲染提高頁面加載速度
這篇文章主要介紹了Angular應(yīng)用prerender預(yù)渲染提高頁面加載速度,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10AngularJS實(shí)現(xiàn)給動(dòng)態(tài)生成的元素綁定事件的方法
這篇文章主要介紹了AngularJS實(shí)現(xiàn)給動(dòng)態(tài)生成的元素綁定事件的方法,結(jié)合實(shí)例形式分析了AngularJS動(dòng)態(tài)生成元素與事件綁定相關(guān)操作技巧,需要的朋友可以參考下2016-12-12淺談Angular.js中使用$watch監(jiān)聽模型變化
當(dāng)angular數(shù)據(jù)模型發(fā)生變化時(shí),我們需要如果需要根據(jù)他的變化觸發(fā)其他的事件。本篇文章主要介紹了Angular.js中使用$watch監(jiān)聽模型變化,有興趣的可以了解一下2017-01-01