Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Checkbox AngularJS:孙子复选框从父项选择复选框_Checkbox_Angularjs_Parent Child - Fatal编程技术网

Checkbox AngularJS:孙子复选框从父项选择复选框

Checkbox AngularJS:孙子复选框从父项选择复选框,checkbox,angularjs,parent-child,Checkbox,Angularjs,Parent Child,我试图在AngularJS中创建一个复选框层次结构。我可以创建一个父复选框,自动选中子复选框,如果我手动选中子复选框,它将更新其子(父的孙子)复选框。但是,如果单击父复选框,它将不会更新孙子的复选框 在添加JavaScript以确保父复选框更新孙子复选框之前,我只想知道是否有更简单的方法。这是我的代码和一个供您使用的示例 <div ng-app=""> <strong>Parent</strong> (will check all Child boxe

我试图在AngularJS中创建一个复选框层次结构。我可以创建一个父复选框,自动选中子复选框,如果我手动选中子复选框,它将更新其子(父的孙子)复选框。但是,如果单击父复选框,它将不会更新孙子的复选框

在添加JavaScript以确保父复选框更新孙子复选框之前,我只想知道是否有更简单的方法。这是我的代码和一个供您使用的示例

<div ng-app="">
    <strong>Parent</strong> (will check all Child boxes):
    <input type="checkbox" ng-model="parent" />
    <br/>
    <strong>Child 1</strong>:
    <input type="checkbox" ng-checked="parent" />
    <br />
    <strong>Child 2</strong>:
    <input type="checkbox" ng-checked="parent" />
    <br />
    <strong>Child 3</strong> (will check all Grandchild boxes):
    <input type="checkbox" ng-checked="parent" ng-model="child" />
    <br />
    <strong>Grandchild 1</strong>:
    <input type="checkbox" ng-checked="child" />
    <br />
    <strong>Grandchild 2</strong>:
    <input type="checkbox" ng-checked="child" />
    <br />
    <strong>Grandchild 3</strong>:
    <input type="checkbox" ng-checked="child" />
</div>

父项(将选中所有子项框):

子1
儿童2
子项3(将选中所有孙子项框):
孙辈1
孙辈2
孙辈3
任何帮助都将不胜感激


还有,有1500名代表的人能帮我创建标记“angularjs ng checked”吗?那太棒了

不幸的是,没有更简单的方法

来自Misko:

。。。我们认为你试图做的没有意义。ng checked创建单向数据绑定,但ng模型创建双向数据绑定。实际上,两个模型连接到同一个输入元素,我认为这是错误的。我认为ng model和ng checked应该单独使用(一个或另一个,但不能同时使用)


除了在控制器中自己使用指令或同步检查之外,没有太多的选项。

我一直在做一些调整(哈哈),我想出了一个似乎非常通用的解决方案。。。也就是说,您可以根据自己的内心需求设置任意多个嵌套复选框。我确信我正在遵循一些奇怪的实践,并且可能有一些地方可以提高性能——这肯定是在许多对象之间循环——所以请随意批评它!我很想听到任何反馈

代码可以在这里找到。我也会把它贴在这里

HTML文件

<!DOCTYPE html>
<html>
  <head>
    <script src="../js/angularjs106.js"></script>
    <script src="angular_checkbox.js"></script>
    <link rel="stylesheet" href="angular_checkbox.css" />
  </head>
  <body ng-app>
    <div ng-controller="Ctrl">
      <ul>
        <li>
          <input type="checkbox" value="allChecks.id" ng-model="allChecks.isChecked" ng-change="checkChange(allChecks)">
          <label>{{allChecks.id}}</label>
        </li>
        <li ng-repeat="child in allChecks.children">
          <input type="checkbox" ng-model="child.isChecked" ng-change="checkChange(child)">
          <label>{{child.id}}</label>
          <ul>
            <li ng-repeat="grandchild in child.children">
              <input type="checkbox" ng-model="grandchild.isChecked" ng-change="checkChange(grandchild)">
              <label>{{grandchild.id}}</label>
              <ul>
                <li ng-repeat="grandgrandchild in grandchild.children">
                  <input type="checkbox" ng-model="grandgrandchild.isChecked" ng-change="checkChange(grandgrandchild)">
                  <label>{{grandgrandchild.id}}</label>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </div>
  </body>  
</html>
小CSS

ul {
  list-style: none;
}
无论如何,我想找出一种在对象中找到父对象的方法。事实证明,本机JavaScript对象不包含对子对象的父对象的引用,因此我决定创建一个名为Node的类。当我实例化节点时,我可以将父节点设置为包含子节点的对象。一旦我这样做了,递归就变得很容易了

parentCheckChange在我们意识到我们有一个父对象时被调用。childCheckChange在孩子的支票更改时调用(duh!),但它用于监视家长的所有孩子。。。如果所有这些都已检查,那么我们需要确保父项已检查,并且由于此父项已检查,我们需要检查是否应(递归)检查其父项


代码可能有点混乱,因此如果您感到困惑,请提出问题

我最近写了这样的东西:。我只是使用了这个模型并遍历了一些数组,以查看是否检查了所有内容(而不是检查dom元素)。请参见
$scope.groupChecked
\u syncGroupCheckBox
(由
$scope.unitChecked
调用)。这可能对JavaScript部分有所帮助,但在我决定喜欢之前,我对一种更简单的方法更感兴趣。尽管如此,还是要感谢代码!不幸的是,没有更简单的方法。这不能简单地通过HTML实现。请看Misko的评论:嗯,很有趣。我想我将开始把这个添加到范围中。如果你加上你最后的评论作为回答,我会接受的。
ul {
  list-style: none;
}