结构-行为-样式 - angularJs 指令实现无限级下拉列表

A、数据格式:

[
{
"groupKey": "c1",
"name": "项目营销",
"selectHide": false,
"son": [
{
"groupKey": "c1t1",
"name": "项目一",
"selectHide": false,
"son": [
{
"groupKey": "c1t1d1",
"name": "项目一1",
"selectHide": false,
"son": [
{
"groupKey": "c1t1d11",
"name": "项目一11",
"selectHide": false,
"son": []
},
{
"groupKey": "c1t1d12",
"name": "项目一12",
"selectHide": false,
"son": []
}
]
},
{
"groupKey": "c1t1d2",
"name": "项目一2",
"selectHide": false,
"son": []
},
{
"groupKey": "c1t1d3",
"name": "项目一3",
"selectHide": false,
"son": []
}
]
},
{
"groupKey": "c1t2",
"name": "项目二",
"selectHide": false,
"son": []
},
{
"groupKey": "c1t3",
"name": "项目三",
"selectHide": false,
"son": []
}
]
}
]

B、页面格式:

<div multi-select skey="arr" collects="selectData"></div>

C、指令:

define(['angular'], function () {
    var commonDirectives = angular.module("commonDirectives", []);
    commonDirectives.directive("multiSelect", [function () {
        return {
            restrict: "AE"
            , scope: {
                collects: "=", //统一Select数据集合
                skey: "=" //当前值数组
            }
            , template: '<div ng-repeat="m in myobj" class="client-search-header-input">' + '<select ng-model="m.select" ng-hide="m.selectHide" ' + 'ng-change="selectChange($index)" class="set-select set-widthauto form-control ' + 'label-extract-select" ng-options="us.name for us in m.myfull">' + ' <option value="">请选择</option>' + '</select>' + '</div>'
            , link: function (scope, element, attrs) { //link是用来做dom绑定操作的
                scope.$watch('collects', function (ov, nv) {
                    if (ov == undefined || ov == "undefined") return;
                    //开始部门多级下拉赋值
                    var arr = scope.skey;
                    scope.j = 0, scope.myobj = [];
                    //递归
                    digui(scope.collects);

                    function digui(useList) {
                        var obj = {};
                        if (useList.length == 0) return;
                        //部门Key为空
                        if (!arr || arr.length == 1 && arr[0] == "") {
                            obj.select = "";
                            obj.myfull = useList;
                            obj.selectHide = false;
                            scope.myobj.push(obj);
                            return;
                            //部门Key不为空
                        }
                        else {
                            while (scope.j <= (arr.length - 1)) {
                                for (var i = 0; i < useList.length; i++) {
                                    if (useList[i].groupKey == arr[scope.j]) {
                                        obj.select = useList[i];
                                        obj.myfull = useList;
                                        obj.selectHide = false;
                                        scope.myobj.push(obj);
                                        scope.j++;
                                        digui(obj.select.son);
                                    }
                                }
                            }
                        }
                    }
                });
            }
            , controller: ["$scope", function (scope) { //controller一般都是用来放公用方法
                //重写下拉Change事件 i 是当前点击的索引值
                scope.selectChange = function (i) {
                        //当前点击不是最后一个
                        var s = scope.myobj[i].select;
                        if (s && s.child.length != 0) {
                            scope.myobj = scope.myobj.slice(0,i+1);
                            var obj = {};
                            obj.select = "";
                            obj.myfull = s.child;
                            obj.selectHide = false;
                            scope.myobj.push(obj);
                            //当前点击是最后一个
                        } else {
                            for (var n = i + 1; n < scope.myobj.length; n++) {
                                scope.myobj[n].selectHide = true;
                            }
                        }
                }
            }]
        }
    }])
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洲上牧童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值