javascript - 为什么 Angular `ng-repeat` 有不同的复选框区分行为然后手动列出复选框?

标签 javascript jquery angularjs checkbox

如果我手动列出复选框

<ul>
    <li>
        <input type="checkbox" ng-model="checkState"/>
    </li>
    <li>
        <input type="checkbox" ng-model="checkState"/>
    </li>
</ul>

选中一个复选框会选中所有复选框。

但是如果我使用 ng-repeat

<div>
    <ul>
        <li ng-repeat="elem in someArray">
            <input type="checkbox" ng-model="checkState"  />
        </li>
    </ul>
</div>

选中一个复选框只会选中其中一个

这是有原因的吗?从 DOM 看,它们看起来一样。

最佳答案

问题与 Angular 范围有关。默认情况下,每个 Angular 应用程序都有一个根范围。但是它可以有多个子作用域。

一些内置指令会创建新的子作用域。 ng-repeat 就是一个例子。该指令中的每个元素都有自己的范围。创建这些范围时,它们会自动添加为父范围的子级。

这会创建一个类似于 DOM 的树结构

rootScope
  - childScope
  - childScope
  - childScope

要查看实际效果,请查看浏览器的 HTML。它看起来像这样

<div>
  <li ng-repeat="elem in someArray" class="ng-scope ng-binding">elem 1
    <input type="checkbox" ng-model="checkState"  />
  </li>
  <li ng-repeat="elem in someArray" class="ng-scope ng-binding">elem 1
    <input type="checkbox" ng-model="checkState"  />
  </li>
</div>

请注意,每个 ng-repeat 元素都有一个 ng-scope 和一个 ng-binding 类。

The directive instantiates a template once per item from a collection. Every template item, in this case every li element has its own scope.

该指令使用 $watchCollection 来检测集合中的变化。 ng-repeat 对 DOM 进行了以下更改

  • 添加新项目时,模板的新实例将添加到 DOM
  • 当一个项目被移除时,它的模板实例也从 DOM 中移除
  • 当项目被重新排序时,它们的模板由 DOM 重新排序

这是 Angular 的官方文档

https://docs.angularjs.org/api/ng/directive/ngRepeat

https://docs.angularjs.org/guide/scope

关于javascript - 为什么 Angular `ng-repeat` 有不同的复选框区分行为然后手动列出复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35761204/

相关文章:

javascript - 如何编写依赖于动态选择器的函数?

javascript - 函数内 Restangular 的 jasmine 测试用例

css - Angular 动画不起作用

javascript - 检查对象是否只包含一个或两个项目 javascript

javascript - 获取 Vine .mp4 源 - iOS

javascript - 我如何在 Node JS 上使用 papaparse?

Mozilla 中的 Javascript 剪贴板 SetData 错误

javascript - 图像未裁剪为正确尺寸

javascript - 将 jQuery 代码翻译为 Google 跟踪代码管理器的纯 JavaScript

javascript - AngularJS/ng-grid - 使用拼接更新数组不会更新 UI