javascript - 将选中的复选框存储到 AngularJS 树结构的数组中

标签 javascript angularjs checkbox tree

目前,我可以使用复选框显示在树结构中具有父子关系的项目。现在我需要将选中的复选框存储到一个数组中,以便我可以通过 ajax 将该数据提交到服务器。

我是 AngularJS 的新手。我尝试使用 ng-model 值进行打印。但它不起作用。

你能帮我解决如何将选中的复选框存储到数组中吗?

下面是代码。

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    <script>
        var app, list;
        list = [
            {
                name: 'Developer',
                opened: true,
                children: [
                    {
                        name: 'Front-End',id:1,
                        children: [
                            {
                                name: 'Jack',id:2,
                                title: 'Leader'
                            },
                            {
                                name: 'John',id:3,
                                title: 'Senior F2E'
                            },
                            {
                                name: 'Jason',id:4,
                                title: 'Junior F2E'
                            }
                        ]
                    },
                    {
                        name: 'Back-End',id:5,
                        children: [
                            {
                                name: 'Mary',id:6,
                                title: 'Leader'
                            },
                            {
                                name: 'Gary',id:7,
                                title: 'Intern'
                            }
                        ]
                    }
                ]
            },
            {
                name: 'Design',id:8,
                children: [{
                    name: 'Freeman',id:9,
                    title: 'Designer'
                }]
            },
            {
                name: 'S&S',id:10,
                children: [{
                    name: 'Nikky',id:11,
                    title: 'Robot'
                }]
            }
        ];
        app = angular.module('testApp', []).controller('treeTable', [
            '$scope',
            '$filter',
            function ($scope, $filter) {
                $scope.list = list;
                //$scope.item.selected={};
                $scope.initCheckbox = function (item, parentItem) {
                    return item.selected = parentItem && parentItem.selected || item.selected || false;
                };
                $scope.toggleCheckbox = function (item, parentScope) {
                    if (item.children != null) {
                        $scope.$broadcast('changeChildren', item);
                    }
                    if (parentScope.item != null) {
                        return $scope.$emit('changeParent', parentScope);
                    }
                };
                $scope.$on('changeChildren', function (event, parentItem) {
                    var child, i, len, ref, results;
                    ref = parentItem.children;
                    results = [];
                    for (i = 0, len = ref.length; i < len; i++) {
                        child = ref[i];
                        child.selected = parentItem.selected;
                        if (child.children != null) {
                            results.push($scope.$broadcast('changeChildren', child));
                        } else {
                            results.push(void 0);
                        }
                    }
                    return results;
                });
                return $scope.$on('changeParent', function (event, parentScope) {
                    var children;
                    children = parentScope.item.children;
                    parentScope.item.selected = $filter('selected')(children).length === children.length;
                    parentScope = parentScope.$parent.$parent;
                    if (parentScope.item != null) {
                        return $scope.$broadcast('changeParent', parentScope);
                    }
                });
            }
        ]);
        app.filter('selected', [
            '$filter',
            function ($filter) {
                return function (files) {
                    return $filter('filter')(files, { selected: true });
                };
            }
        ]);
    </script>
</head>
<body>
    <div class="wrapper" ng-app="testApp" ng-controller="treeTable">
        <table class="table-nested">
            <tbody  ng-class="{opened: item.opened}" ng-include="'table_tree.html'" ng-repeat="item in list"></tbody>
        </table>
        <script id="table_tree.html" type="text/ng-template">
            <tr ng-class="{parent: item.children}" ng-init="parentScope = $parent.$parent; initCheckbox(item, parentScope.item)">
                <td class="cell-name">
                    <div class="indent" ng-click="item.opened = !item.opened"></div>
                    <input ng-change="toggleCheckbox(item, parentScope)" ng-model="item.selected" type="checkbox"  />
                    {{item.name}}
                </td>
            </tr>
            <tr class="children" ng-if="item.children && item.children.length > 0">
                <td colspan="4">
                    <table class="table-child">
                        <tbody ng-class="{opened: item.opened}" ng-include="'table_tree.html'" ng-init="level = level + 1" ng-repeat="item in item.children"></tbody>
                    </table>
                </td>
            </tr>
        </script>
        {{item.selected | json}}
    </div>
</body>

check plunker here

最佳答案

也许你可以这样做:

JS:

        $scope.seleceds = {};
        $scope.initCheckbox = function (item, parentItem) {
            return $scope.seleceds[item.id] = parentItem && $scope.seleceds[parentItem.id] || $scope.seleceds[item.id] || false;
        };
        $scope.toggleCheckbox = function (item, parentScope) {
            if (item.children != null) {
                $scope.$broadcast('changeChildren', item);
            }
            if (parentScope.item != null) {
                return $scope.$emit('changeParent', parentScope);
            }
        };
        $scope.$on('changeChildren', function (event, parentItem) {
            var child, i, len, ref, results;
            ref = parentItem.children;
            results = [];
            for (i = 0, len = ref.length; i < len; i++) {
                child = ref[i];
                $scope.seleceds[child.id] = $scope.seleceds[parentItem.id];
                if (child.children != null) {
                    results.push($scope.$broadcast('changeChildren', child));
                } else {
                    results.push(void 0);
                }
            }
            return results;
        });
        return $scope.$on('changeParent', function (event, parentScope) {
            var children;
            children = parentScope.item.children;
            $scope.seleceds[parentScope.item.id] = $filter('selected')(children, $scope.seleceds).length === children.length;
            parentScope = parentScope.$parent.$parent;
            if (parentScope.item != null) {
                return $scope.$broadcast('changeParent', parentScope);
            }
        });

额外过滤器:

app.filter('selected', ['$filter', function ($filter) {
    return function (files, obj) {
        return $filter('filter')(files, function (value) {
            return obj[value.id]
        });
    };
}]);

app.filter('objToArray', function () {
    return function (input) {
        var results = [];
        for (var key in input) {
            input[key] && results.push(Number(key))
        }
        return results;
    }
});

HTML:

 <input ng-change="toggleCheckbox(item, parentScope)" ng-model="seleceds[item.id]" type="checkbox"/>

并更改{{item.selected | json}}{{seleceds|objToArray}}

您可以观看演示HERE

关于javascript - 将选中的复选框存储到 AngularJS 树结构的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38428904/

相关文章:

javascript - 在netflix的silverlight播放器中使用javascript暂停、跳转到位置、调节音量

javascript - 在 Angular 7 中并排组合两个数组

javascript - Jquery keyup事件没有触发

jQuery - 组合 <select> 和复选框时出错

javascript - 如何使用jQuery同步加载页面

javascript - 启用和禁用 ionic 中的输入字段

javascript - 如何从 Angular JS 中的 HttpResponse 中提取 JSON 数据?

javascript - 使用 javascript 保存复选框值的简单方法?

javascript - JsViews 复选框从内部循环绑定(bind)

javascript - 单击复选框清除表单字段