Cascader.js 2.24 KB
/**
 * 级联
 *
 * @Author: Shann
 * @LastEditors: Shann
 * @Date: 2021-08-04 09:48:49
 * @LastEditTime: 2021-08-04 11:00:19
 * @Copyright: Copyright 2021-2021, all rights reserved. Essa.cn
 */
angular.module("esNgAntd").directive("esCascader", function () {
    return {
        controllerAs: "esCascader",
        restrict: "E",
        transclude: true,
        replace: true,
        scope: {
            options: "=",
        },
        controller: function ($scope, $element) {
            this.getContext = function () {
                return $scope;
            };

            $scope.state = {
                options: [],
                menus: [],
            };

            $scope.flatten = function (array, level = 1) {
                let elements = [];
                array.forEach((element) => {
                    element.level = level;
                    elements.push(element);

                    if (
                        typeof element.children !== "undefined" &&
                        element.children.length > 0
                    ) {
                        elements = elements.concat(
                            $scope.flatten(element.children, level + 1)
                        );
                    }
                });
                return elements;
            };

            $scope.handleFocus = function () {
                $scope.state.menus.push($scope.options);
            };

            $scope.handleBlur = function () {
                $scope.state.menus = [];
            };

            $scope.handleExpand = function (value) {
                let current = $scope.state.options.filter(
                    (item) => item.value === value
                )[0];

                if ($scope.state.menus.length > current.level) {
                    $scope.state.menus.splice(current.level);
                }

                if (
                    typeof current.children !== "undefined" &&
                    current.children.length > 0
                ) {
                    $scope.state.menus.push(current.children);
                }
            };
        },
        link: function ($scope, $element, $attrs, $controllers, $transclude) {
            $scope.state.options = $scope.flatten($scope.options);
        },
    };
});