(function (module) { module.directive('focusMe', function ($timeout) { return { link: function (scope, element, attrs) { $timeout(function () { element[0].focus(); }, 150); } }; }); module.directive('ionAmapPlace', [ '$ionicTemplateLoader', '$ionicBackdrop', '$ionicPlatform', '$q', '$timeout', '$rootScope', '$document', function ($ionicTemplateLoader, $ionicBackdrop, $ionicPlatform, $q, $timeout, $rootScope, $document) { return { require: '?ngModel', restrict: 'E', template: '', replace: true, scope: { ngModel: '=?' }, link: function (scope, element, attrs, ngModel) { var unbindBackButtonAction; scope.locations = []; var autocomplete; AMap.plugin('AMap.Autocomplete', function () { //回调函数 //实例化Autocomplete var autoOptions = { city: "" //城市,默认全国 }; autocomplete = new AMap.Autocomplete(autoOptions); }); //var geocoder = new google.maps.Geocoder(); var searchEventTimeout = undefined; var POPUP_TPL = [ '' ].join(''); var popupPromise = $ionicTemplateLoader.compile({ template: POPUP_TPL, scope: scope, appendTo: $document[0].body }); popupPromise.then(function (el) { var searchInputElement = angular.element(el.element.find('input')); scope.selectLocation = function (location) { ngModel.$setViewValue(location); el.element.css('display', 'none'); $ionicBackdrop.release(); if (unbindBackButtonAction) { unbindBackButtonAction(); unbindBackButtonAction = null; } }; scope.$watch('searchQuery', function (query) { if (searchEventTimeout) $timeout.cancel(searchEventTimeout); searchEventTimeout = $timeout(function () { if (!query) return; if (query.length < 2) return; autocomplete.search(query, function (status, result) { if (status === "complete") { scope.$apply(function () { scope.locations = result.tips; }); } else { //todo } }); //geocoder.geocode(req, function (results, status) { // if (status == google.maps.GeocoderStatus.OK) { // scope.$apply(function () { // scope.locations = results; // }); // } else { // // @TODO: Figure out what to do when the geocoding fails // } //}); }, 350); // we're throttling the input by 350ms to be nice to google's API }); var onClick = function (e) { e.preventDefault(); e.stopPropagation(); $ionicBackdrop.retain(); unbindBackButtonAction = $ionicPlatform.registerBackButtonAction(closeOnBackButton, 250); el.element.css('display', 'block'); searchInputElement[0].focus(); setTimeout(function () { searchInputElement[0].focus(); }, 0); }; var onCancel = function (e) { scope.searchQuery = ''; $ionicBackdrop.release(); el.element.css('display', 'none'); if (unbindBackButtonAction) { unbindBackButtonAction(); unbindBackButtonAction = null; } }; closeOnBackButton = function (e) { e.preventDefault(); el.element.css('display', 'none'); $ionicBackdrop.release(); if (unbindBackButtonAction) { unbindBackButtonAction(); unbindBackButtonAction = null; } } element.bind('click', onClick); element.bind('touchend', onClick); el.element.find('button').bind('click', onCancel); }); if (attrs.placeholder) { element.attr('placeholder', attrs.placeholder); } ngModel.$formatters.unshift(function (modelValue) { if (!modelValue) return ''; return modelValue; }); ngModel.$parsers.unshift(function (viewValue) { return viewValue; }); ngModel.$render = function () { if (!ngModel.$modelValue) { element.val(''); } else { element.val(ngModel.$modelValue.district + ngModel.$modelValue.name || ''); } }; scope.$watch(function () { return ngModel.$modelValue; }, function (modelValue) { ngModel.$render(); }); scope.$on("$destroy", function () { if (unbindBackButtonAction) { unbindBackButtonAction(); unbindBackButtonAction = null; } }); } }; } ]); })(angular.module('app.directives'));