javascript - AngularJS - 多级复选框问题

标签 javascript angularjs checkbox

我在大组中有多个级别的复选框。单击复选框的第一级时,将出现第二级;单击复选框的第二级时,将出现第三级。

当第一级复选框未被选中时,所有内部级别的复选框都应该被取消选中。

我使用了 ng-ifng-init 来实现这一点。但这在保存数据时给我带来了问题。

enter image description here

我有大量的一级复选框,那么如何以简单的方式清除或取消选中所有内级复选框和单选框。

ng-click上调用方法并一一清除模型将非常复杂。有什么简单的方法可以解决这个问题?

我的代码:-

    <div ng-repeat="todo in todos" class="col-sm-12">
        <div class="col-sm-12">
            <input type="checkbox" ng-model="todo.level1" />
            <label>Level 1</label>
        </div>
        <div class="col-sm-12" ng-if="todo.level1">

<div class="col-sm-12">
                    <div class="col-sm-offset-1 col-sm-11" ng-if="todo.level1">
                        <input type="checkbox" ng-model="todo.c4" ng-init="todo.c4 = false" />
                        <label>&nbsp;C4</label>
                    </div>
                    <div class="col-sm-12" ng-if="todo.c4">
                        <div class="col-sm-12" ng-if="todo.c4">
                            <div class="margin-left-2">
                                <input type="checkbox" ng-model="todo.c4vert" ng-init="todo.c4vert = false" />
                                <label>&nbsp;Xyz</label>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4vert">
                            <div class="margin-left-3">
                                <select id="Select3">
                                    <option>Choose</option>
                                    <option>25%</option>
                                    <option>50%</option>                                    
                                </select>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4">
                            <div class="margin-left-2">
                                <input type="checkbox" ng-model="todo.c4post" ng-init="todo.c4post = false" />
                                <label>&nbsp;ABC</label>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4post">
                            <div class="margin-left-3">
                                <label>Quest?</label><br />
                                <input type="radio" value="Yes" ng-model="todo.c4postdisloc" ng-init="todo.c4postdisloc = false" /><label>&nbsp;Yes</label>
                                <input type="radio" value="No" ng-model="todo.c4postdisloc" ng-init="todo.c4postdisloc = false" /><label>&nbsp;No</label>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4post">
                            <div class="margin-left-3">
                                <label>Quest 2?</label><br />
                                <input type="radio" value="Yes" ng-model="todo.c4postspinal" ng-init="todo.c4postspinal = false" /><label>&nbsp;Yes</label>
                                <input type="radio" value="No" ng-model="todo.c4postspinal" ng-init="todo.c4postspinal = false" /><label>&nbsp;No</label>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4">
                            <div class="margin-left-2">
                                <input type="checkbox" ng-model="todo.c4trans" ng-init="todo.c4trans = false" />
                                <label>&nbsp;LMN</label>
                            </div>
                        </div>
                        <div class="col-sm-12" ng-if="todo.c4trans">
                            <div class="margin-left-3">
                                <label>TYU </label>
                                <br />
                                <input type="radio" value="Yes" ng-model="todo.c4transdisplace" ng-init="todo.c4transdisplace = false" /><label>&nbsp;Yes</label>
                                <input type="radio" value="No" ng-model="todo.c4transdisplace" ng-init="todo.c4transdisplace = false" /><label>&nbsp;No</label>
                            </div>
                        </div>
                    </div>
                </div>

        </div>
    </div>

使用ng-init给我带来了一个问题,因为复选框的值是从数据库加载的,ng-init使所有值false .

最佳答案

您应该将复选框绑定(bind)到包含 true 或 false 的模型。然后使用 ng-show 隐藏/显示层次结构。您可以使用递归函数来重置所有模型。

这是一个 fiddle :http://jsfiddle.net/93R8e/17/

标记:

<div ng-app="app" ng-controller="myCtrl">
    <div ng-repeat="checkbox in checkboxes">        
        <div>
            <input type="checkbox" ng-model="checkbox.checked" ng-change="actions.reset(checkbox)"/>
            <span ng-bind="checkbox.name"></span>
        </div>
        <div style="margin-left: 20px;" ng-repeat="checkboxLevel2 in checkbox.values" ng-show="checkbox.checked">
            <input type="checkbox" ng-model="checkboxLevel2.checked"/>
            <span ng-bind="checkboxLevel2.name"></span>
        </div>      
    </div>
</div>

JavaScript:

var app = angular.module('app', []);
app.controller('myCtrl', function($scope) {
    $scope.checkboxes = [
        { name: 'checkbox 1', checked: true, values: [ 
            { name: 'checkbox 1 - 1', checked: true },
            { name: 'checkbox 1 - 2', checked: true }
        ]},
        { name: 'checkbox 2', checked: false, values: [] }        
    ];

    $scope.actions = {
        reset: function (checkbox) {      
            if(!checkbox.hasOwnProperty('values') || checkbox.values.length === 0) {
                return;
            }

            for(var i = 0; i < checkbox.values.length; i ++) {
                checkbox.values[i].checked = false;
                $scope.actions.reset(checkbox.values[i]);
            }
        }
    };    

});

希望这有帮助

关于javascript - AngularJS - 多级复选框问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483363/

相关文章:

javascript - 为什么这个变量没有更大的作用域?

javascript - 元素具有 `checked` 属性但未检查?

javascript - 使用表中的选定选项计算单元格值

javascript - Angularjs 检索特定名称/对象

html - 禁用 Firefox 上的复选框

javascript - 使用 GitHub API 检索具有特定扩展名的文件

javascript - 页面加载时的事件类未触发

javascript - Rails 生产中的背景图像不起作用

javascript - 通过 ng-click 将 ng-model 变量传递给函数

javascript - 指令内的 AngularJS $watch 未触发