angular.js实现省市区三级联动指令

不多说,直接上代码,一开始搞了好久,最后才弄懂,希望对大家有帮助

1.jade

 

div.col-md-2
    select.form-control(ng-options="value.code as value.name for value in provincial" ng-model="info.provincial" required='' ng-change="getArea('city',info.provincial)")
        option(value='') 选择省
div.col-md-2 
    select.form-control(ng-options="value.code as value.name for value in city" ng-model="info.city" required='' ng-change="getArea('district',info.city)")
        option(value='') 选择市
div.col-md-2
    select.form-control(ng-options="value.code as value.name for value in district" ng-model="info.district" required='' ng-change="areaText()")
        option(value='') 选择区

 

 

js

  

  传的值

  后台返回的数据 省

  

   

  传的值

  后台返回的数据 市

  

 

angular.module('app').directive('provinceSelect', ['$rootScope', 'api', function($rootScope, api) {
    // Runs during compile
    'use strict';
    return {
        // name: '',
        // priority: 1,
        // terminal: true,
        scope: {
            info: '=info',
            area: '=area'
        }, // {} = isolate, true = child, false/undefined = no change
        controller: function($scope, $element, $attrs, $transclude) {
            function getArea(id, returnFn) {
                api("areaList", { //后台给的省市区接口
                    data: {
                        parentId: id
                    }
                }).then(function(data) {
                    returnFn(data);
                });
            }
            $scope.getArea = function(name, id) {
                if (name === 'city' && id === undefined) {
                    $scope.city = [];
                    $scope.district = [];
                    return;
                } else if (name === 'district' && id === undefined) {
                    $scope.district = [];
                    return;
                }
                getArea(id || 0, function(data) {
                    $scope[name] = data;
                });
            };
            $scope.getArea('provincial', 0);
            $scope.$watch('info', function(newVal, oldVal) {
                if (newVal) {
                    $scope.getArea('city', newVal.provincial);
                    $scope.getArea('district', newVal.city);

                }
            });
            // provincialWatch();
            // if ($scope.info.provincial) {
            //     $scope.getArea('city', $scope.provincial);
            // }
            // if ($scope.info.district) {
            //     $scope.getArea('district', $scope.city);
            // }
            $scope.areaText = function() {
                var area = $element.find("select");
                var areas = '';
                for (var i = 0; i < area.length; i++) {
                    var index = area[i].selectedIndex;
                    if (index === 0) {continue;}
                    areas += area[i].options[index].text;
                }
                $scope.area = areas;
            };
        },
        // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements
        // restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
        // template: '',
        templateUrl: 'app/dist/directive/provinceSelect/provinceSelect.html',
        // replace: true,
        transclude: true,
        // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})),
        link: function($scope, iElm, iAttrs, controller) {
            //console.log($scope)
        }
    };
}]);

 

posted @ 2016-12-07 14:34  quan134  阅读(3303)  评论(0编辑  收藏  举报