• ionic 城市选择器


    ionic中很火的ionic-citypicker让人很失望,实测在安卓中没有效果。经过排错发现,在安卓里面不支持on-scroll-complete事件。最终选择了放弃(怪我无能。。。)

    后来,好心人给了个案例。就直接用了。现在把代码贴出来。

    大概的思路还是通过自定义指令和调用模板完成的。。。

    HTML
    <hms-pct-select ng-transclude></hms-pct-select>
    模板:
    <script id="hmsPCTSelect-modal.html" type="text/ng-template">
      <ion-modal-view>
        <ion-header-bar class="bar-balanced">
          <div class="buttons" ng-show="showBackBtn">
            <button ng-click="goBackSlide()" class="button button-clear">
              返回
            </button>
          </div>
          <h1 class="title">选择地址</h1>
          <div class="buttons">
            <button ng-click="PCTModal.hide();" class="button button-clear">
              取消
            </button>
          </div>
        </ion-header-bar>
        <ion-content overflow-scroll="true" style="overflow: hidden">
          <ion-slide-box show-pager="false" style="height: 100%;" does-continue="false" delegate-handle="PCTSelectDelegate" ng-init="lockSlide()">
            <ion-slide >
              <ion-scroll style="height: 100%;" scrollbar-y="false" delegate-handle="PCTSelectProvince">
                <ion-item class="item-icon-right" ng-click="chooseProvince(item);" ng-repeat="item in provincesData">
                  <span>{{item}}</span>
                  <i class="icon ion-ios-arrow-right icon-item"></i>
                </ion-item>
              </ion-scroll>
            </ion-slide>
            <!--省选择结束-->
    
            <!--市选择开始-->
            <ion-slide>
              <ion-scroll style="height: 100%;" scrollbar-y="false" delegate-handle="PCTSelectCity">
                <ion-item class="item-icon-right" ng-click="chooseCity(item);" ng-repeat="item in citiesData">
                  <span>{{item}}</span>
                  <i class="icon ion-ios-arrow-right icon-item"></i>
                </ion-item>
              </ion-scroll>
            </ion-slide>
            <!--市选择结束-->
    
            <!--县选择开始-->
            <ion-slide>
              <ion-scroll style="height: 100%;" scrollbar-y="false" delegate-handle="PCTSelectTown">
                <ion-item class="item-icon-right" ng-click="chooseTown(item);" ng-repeat="item in townData">
                  <span>{{item}}</span>
                  <i class="icon ion-ios-arrow-right icon-item"></i>
                </ion-item>
              </ion-scroll>
            </ion-slide>
          </ion-slide-box>
    
        </ion-content>
      </ion-modal-view>
    
    </script>
    自定义指令:
    .directive('hmsPctSelect', function () {
        var TAG = 'hmsPCTSelectDirective';
        return {
          restrict: 'EA',
          scope: {
            default: '=defaultdata'
          },
          replace: true,
          transclude: true,
          template: '<div class="col" style="font-size: 14px;" ng-click="toSetDefaultPosition();">' +
          '{{selectedAddress.province+selectedAddress.city+selectedAddress.town}}' +
          '</div>',
          controller: function ($scope, $element, $attrs, $ionicModal, $http, $ionicSlideBoxDelegate, $timeout, $rootScope, $ionicScrollDelegate) {
            var selectedAddress = {};
            var addressData;
            this.$onInit = function () {
              selectedAddress = {};
              $scope.selectedAddress = {};
    
    
              $http.get('http://runjs.cn/uploads/rs/41/r7zpvbql/Area_Datas_v2.json').success(function (res) {//调取城市选择器的接口获取城市数据
                addressData = res;
                $scope.provincesData = addressData['86'];
              }).error(function (err) {
                console.log('area_datas err = ' + angular.toJson(err));
              });
    
              $ionicModal.fromTemplateUrl('hmsPCTSelect-modal.html', {
                scope: $scope,
                animation: 'slide-in-up'
              }).then(function (modal) {
                $scope.PCTModal = modal;
              })
            };
    
            $scope.lockSlide = function () {
              $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').enableSlide(false);
            };
    
            $scope.$watch('default', function (newValue) {
              if (newValue) {
                $scope.selectedAddress = newValue;
              }
            });
    
            $scope.toSetDefaultPosition = function () {
              $scope.showBackBtn = false;
              $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').slide(0);
              $ionicScrollDelegate.$getByHandle('PCTSelectProvince').scrollTop();
              $scope.PCTModal.show();
            };
    
            //选择省
            $scope.chooseProvince = function (selectedProvince) {
              var selectedProvinceIndex;
    
              angular.forEach($scope.provincesData, function (item, index) {
                if (item === selectedProvince) {
                  selectedProvinceIndex = index;
                  return;
                }
              });
    
    
              selectedAddress = {};
              $scope.showBackBtn = true;
              $scope.citiesData = addressData['' + selectedProvinceIndex + ''];
    
    
              $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').next();
              $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').update();
              $ionicScrollDelegate.$getByHandle('PCTSelectCity').scrollTop();
              selectedAddress.province = selectedProvince;
            };
    
            //选择市
            $scope.chooseCity = function (selectedCity) {
              var selectedCityIndex;
    
              angular.forEach($scope.citiesData, function (item, index) {
                if (item === selectedCity) {
                  selectedCityIndex = index;
                  return;
                }
              });
    
              $scope.townData = addressData['' + selectedCityIndex + ''];
    
              selectedAddress.city = selectedCity;
              if (!$scope.townData) {
                selectedAddress.town = '';
                $scope.selectedAddress = selectedAddress;
    
                $rootScope.$broadcast('PCTSELECT_SUCCESS', {result: $scope.selectedAddress});
    
                $timeout(function () {
                  $scope.PCTModal.hide();
                }, 200);
              }else{
                $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').next();
                $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').update();
                $ionicScrollDelegate.$getByHandle('PCTSelectTown').scrollTop();
              }
            };
    
            //选择县
            $scope.chooseTown = function (selectedTown) {
              selectedAddress.town = selectedTown;
              $scope.selectedAddress = selectedAddress;
    
              $rootScope.$broadcast('PCTSELECT_SUCCESS', {result: $scope.selectedAddress});
    
              $timeout(function () {
                $scope.PCTModal.hide();
              }, 200);
            };
    
            //slide返回上一级
            $scope.goBackSlide = function () {
              var currentIndex = $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').currentIndex();
              if (currentIndex > 0) {
                $ionicSlideBoxDelegate.$getByHandle('PCTSelectDelegate').previous();
              }
              if (currentIndex === 1) {
                $scope.showBackBtn = false;
              }
            };
    
            $scope.$on('$destroy', function () {
              $scope.PCTModal.remove();
            });
          }
        };
      })

    奉上链接:http://runjs.cn/code/jmlmssfr

  • 相关阅读:
    Ajax-ajax实例2-根据邮政编码获取地区信息
    javascript-限制文本框只输入数字
    Ajax-ajax实例1-动态加载的 FAQ
    Ajax-java中的ajax使用,以及编码问题
    java-request与response编码问题
    XMLHttpRequest对象的常用属性与方法
    Ajax类
    java-servlet 新增特性 注释
    java-servlet的url-pattern匹配规则详细描述
    java-过滤器Filter_多个Filter的执行顺序
  • 原文地址:https://www.cnblogs.com/ywang/p/6340785.html
Copyright © 2020-2023  润新知