starter.directive('itemMember', function (Dept) { return { restrict: 'E', replace: true, template: '
' + '' + '' + '' + '' + '
' }; }) .directive('itemDept', function (Dept) { return { restrict: 'E', replace: true, template: '
' + '' + '{{dept.depname}}' + '' + '' + '
' }; }) .directive('footerMember', function (Dept) { return { restrict: 'E', replace: true, template: '' }; }) .directive('rjCloseBackDrop', [function () { return { scope: false, restrict: 'A', replace: false, link: function (scope, iElm, iAttrs, controller) { var htmlEl = angular.element(document.querySelector('html')); htmlEl.unbind("click"); htmlEl.on("click", function (event) { if (event.target.nodeName === "HTML" && scope.popup.optionsPopup && scope.popup.isPopup) { scope.popup.optionsPopup.close(); scope.popup.isPopup = false; } else if (event.target.nodeName === "DIV" && scope.popup.optionsPopup && scope.popup.isSetPopup) { scope.popup.optionsPopup.close(); scope.popup.isSetPopup = false; } }); } }; }]) //放大缩小图片 .directive('ngPinchZoom', [function () { var _directive = { restrict: 'A', scope: false, link: _link }; function _link(scope, element, attrs) { var elWidth, elHeight; // mode : 'pinch' or 'swipe' var mode = ''; // distance between two touche points (mode : 'pinch') var distance = 0; var initialDistance = 0; // image scaling var scale = 1; var relativeScale = 1; var initialScale = 1; var maxScale = parseInt(attrs.maxScale, 10); if (isNaN(maxScale) || maxScale <= 1) { maxScale = 3; } // position of the upper left corner of the element var positionX = 0; var positionY = 0; var initialPositionX = 0; var initialPositionY = 0; // central origin (mode : 'pinch') var originX = 0; var originY = 0; // start coordinate and amount of movement (mode : 'swipe') var startX = 0; var startY = 0; var moveX = 0; var moveY = 0; var image = new Image(); image.onload = function () { elWidth = element[0].clientWidth; elHeight = element[0].clientHeight; element.css({ '-webkit-transform-origin': '0 0', 'transform-origin': '0 0' }); element.on('touchstart', touchstartHandler); element.on('touchmove', touchmoveHandler); element.on('touchend', touchendHandler); }; if (attrs.ngSrc) { image.src = attrs.ngSrc; } else { if (attrs.src) { image.src = attrs.src; } } /** * @param {object} evt */ function touchstartHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; startX = touches[0].clientX; startY = touches[0].clientY; initialPositionX = positionX; initialPositionY = positionY; moveX = 0; moveY = 0; } /** * @param {object} evt */ function touchmoveHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; if (mode === '') { if (touches.length === 1 && scale > 1) { mode = 'swipe'; } else if (touches.length === 2) { mode = 'pinch'; initialScale = scale; initialDistance = getDistance(touches); originX = touches[0].clientX - parseInt((touches[0].clientX - touches[1].clientX) / 2, 10) - element[0].offsetLeft - initialPositionX; originY = touches[0].clientY - parseInt((touches[0].clientY - touches[1].clientY) / 2, 10) - element[0].offsetTop - initialPositionY; } } if (mode === 'swipe') { evt.preventDefault(); moveX = touches[0].clientX - startX; moveY = touches[0].clientY - startY; positionX = initialPositionX + moveX; positionY = initialPositionY + moveY; transformElement(); } else if (mode === 'pinch' && touches.length === 2) { evt.preventDefault(); distance = getDistance(touches); relativeScale = distance / initialDistance; scale = relativeScale * initialScale; positionX = originX * (1 - relativeScale) + initialPositionX + moveX; positionY = originY * (1 - relativeScale) + initialPositionY + moveY; transformElement(); } } /** * @param {object} evt */ function touchendHandler(evt) { var touches = evt.originalEvent ? evt.originalEvent.touches : evt.touches; if (mode === '' || touches.length > 0) { return; } if (scale < 1) { scale = 1; positionX = 0; positionY = 0; } else if (scale > maxScale) { scale = maxScale; relativeScale = scale / initialScale; positionX = originX * (1 - relativeScale) + initialPositionX + moveX; positionY = originY * (1 - relativeScale) + initialPositionY + moveY; } else { if (positionX > 0) { positionX = 0; } else if (positionX < elWidth * (1 - scale)) { positionX = elWidth * (1 - scale); } if (positionY > 0) { positionY = 0; } else if (positionY < elHeight * (1 - scale)) { positionY = elHeight * (1 - scale); } } transformElement(0.1); mode = ''; } /** * @param {Array} touches * @return {number} */ function getDistance(touches) { var d = Math.sqrt(Math.pow(touches[0].clientX - touches[1].clientX, 2) + Math.pow(touches[0].clientY - touches[1].clientY, 2)); return parseInt(d, 10); } /** * @param {number} [duration] */ function transformElement(duration) { var transition = duration ? 'all cubic-bezier(0,0,.5,1) ' + duration + 's' : ''; var matrixArray = [scale, 0, 0, scale, positionX, positionY]; var matrix = 'matrix(' + matrixArray.join(',') + ')'; element.css({ '-webkit-transition': transition, transition: transition, '-webkit-transform': matrix + ' translate3d(0,0,0)', transform: matrix }); } } return _directive; }]) .directive('focusMe', function ($timeout) { return { scope: { trigger: '=focusMe' }, link: function (scope, element) { scope.$watch('trigger', function (value) { if (value === true) { $timeout(function () { element[0].focus(); }); } }); } }; }) .directive('imagePopover', [function () { return { restrict: "E", scope: { allImages: '=' }, template: "", controller: function ($scope, $rootScope, $ionicModal) { $scope.showImages = function (index, event) { if (event != undefined) { event.stopPropagation(); } $scope.activeSlide = index; $scope.showModal('../../templates/modal-imagepopover.html'); }; $scope.bigImage = $rootScope.commons.bigImage; $scope.showModal = function (templateUrl) { $rootScope.commons.fun = clear_change; $rootScope.commons.bigImage = true; $ionicModal.fromTemplateUrl(templateUrl, { scope: $scope, animation: 'slide-in-up' }).then(function (modal) { $rootScope.commons.modal = modal; $rootScope.commons.modal.show(); }); }; $scope.closeModal = function () { clear_change(); $rootScope.commons.fun = null; }; function clear_change() { $rootScope.commons.bigImage = false; $rootScope.commons.modal.hide(); $rootScope.commons.modal.remove(); $rootScope.commons.modal = null; } } } }]) .directive('removePopoverHeader', [function () { return { restrict: "A", link: function (scope, iElm, iAttrs, controller) { document.getElementsByClassName('popup')[0].removeChild(document.getElementsByClassName('popup-head')[0]); } } }]) .directive('setPopoverStyle', [function () { return { restrict: "A", scope:{ width:"=", headerwidth:"=" }, link: function (scope, iElm, iAttrs, controller) { document.getElementsByClassName('popup')[0].style.width="300px"; document.getElementsByClassName('popup-head')[0].className +=" popup-header-height"; } } }]) .directive('ionBackButton', [function () { return { restrict: "E", replace: false, template: '', controller: function ($scope, global) { $scope.goBack = function () { global.goBack(); } } } }]) .directive('showBigImage', [function () { return { restrict: "E", scope: { url: '=', files: '=' }, template: "", controller: function ($scope, $rootScope) { $scope.showBigImage = function (img) { $scope.url = img.file_full_path; $rootScope.commons.bigImage = true; } } } }]) .directive('resetField', ['$compile', '$timeout', function($compile, $timeout) { return { require: 'ngModel', scope: {}, link: function(scope, el, attrs, ctrl) { // limit to input element of specific types var inputTypes = /text|search|tel|url|email|password/i; if (el[0].nodeName === "INPUT") { if (!inputTypes.test(attrs.type)) { throw new Error("Invalid input type for resetField: " + attrs.type); } } else if (el[0].nodeName !== "TEXTAREA") { throw new Error("resetField is limited to input and textarea elements"); } // compiled reset icon template var template = $compile('')(scope); el.addClass("reset-field"); el.after(template); scope.reset = function() { ctrl.$setViewValue(null); ctrl.$render(); $timeout(function() { el[0].focus(); }, 0, false); scope.enabled = false; }; el.bind('input', function() { scope.enabled = !ctrl.$isEmpty(el.val()); }) .bind('focus', function() { $timeout(function() { //Timeout just in case someone else is listening to focus and alters model scope.enabled = !ctrl.$isEmpty(el.val()); scope.$apply(); }, 0, false); }) .bind('blur', function() { $timeout(function() { scope.enabled = false; scope.$apply(); }, 0, false); }); } }; }])