在 ng-repeat 中递归迭代时如何获取 ng-include 中的父元素

2023-12-19

我创建了一个递归 ng-repeat 元素,并且尝试操纵事物变成了一场噩梦,因为我没有引用我正在迭代的父元素。

ng-repeat 看起来像这样:

ng-repeat="(key, value) in value"

请记住,它是递归的,因此 value 中的每个值都会成为新值,因此我不能只使用 ng-repeat 中的“in”值。我想做这样的事情,例如检查父级是否是一个数组,但是 $parent 是一些奇怪的东西,而不是当前迭代值的父元素。

我想做的一些事情的例子是:

ng-show="isArray(parent)"
ng-click="delete(parent, $index)"

(作为我正在做的解决方法的一个例子,我必须向每个数组元素添加一个 ___ISARRAYELMENT___ 属性,只是为了知道它位于数组中 >.>;;)

编辑:基本上我想知道我缺少的 ng-repeat 上下文中是否有任何方便的元数据。

编辑:好的,这是完整的 html:

<html ng-app>
<head>
    <title>JSON CRUD</title>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
    <script src="angularjsoncrud.js"></script>
    <script type="text/ng-template" id="node.html">
        <button ng-click="minimized = !minimized" ng-show="!isLeaf(value)" ng-init="minimized=false" ng-class="{'glyphicon glyphicon-plus': minimized, 'glyphicon glyphicon-minus': !minimized}">-</button>
        <input ng-model="value.___KEY___" ng-if="!isArrayElement(value)" />
        <input ng-if="isLeaf(value)" ng-model="value.___VALUE___" />
        <ul ng-if="!isLeaf(value)" ng-show="!minimized">
            <li ng-repeat="(key,value) in value" ng-if="key != '___KEY___' && key != '___ISARRAY___'" ng-include="'node.html'"></li>
            <button type="button" ng-if="isArray(value)" ng-click="addToArray(value)">Add Element</button>
        </ul>
    </script>
</head>
<body ng-app="Application" ng-controller="jsoncrudctrl">
    <ul>
        <li ng-repeat="(key,value) in json" ng-include="'node.html'"></li>
    </ul>
    <pre>{{stringify(json)}}</pre>
</body>
</html>

我想做的一件事是将 Array Element(value) 替换为 isArray(parent),因为 isArray Element 依赖于我添加到数组中的元数据,而我宁愿不必添加。


ng-repeat为每个元素创建一个新的范围。
ng-include还创建了一个新的范围。

当你使用ng-include和...一起ng-repeat,为每个元素创建 2 个范围:

  • 范围创建者ng-repeat对于当前元素。该范围保存迭代中的当前元素。
  • 子范围由...制作ng-include which inherits from ng-repeat的创建范围。

The $parent当前作用域的属性允许您访问其父作用域。

本质上,范围创建者ng-include是空的,当你访问value and key在你的node.html,它实际上访问的是继承的价值观来自创建的父范围ng-repeat.

在你的node.html中,访问{{value}}实际上是一样的{{$parent.value}}。因此,如果您需要访问当前元素的父元素,则必须通过访问来更进一步{{$parent.$parent.value}}

This DEMO http://jsfiddle.net/dqrb5/1/会澄清事情:

    <script type="text/ng-template" id="node.html">
        <div>
            Current: key = {{key}}, value = {{value}}
        </div>
        <div>
            Current (using $parent): key = {{$parent.key}}, value = {{$parent.value}}
        </div>
         <div>
             Parent: key = {{$parent.$parent.key}}, value = {{$parent.$parent.value}}, isArray: {{isArray($parent.$parent.value)}}
        </div>
        <ul ng-if="isObject(value)"> //only iterate over object to avoid problems when iterating a string
<li ng-repeat="(key,value) in value" ng-include="'node.html'"></li>            
        </ul>
    </script>

如果您需要简化访问父级的方式,您可以尝试使用初始化父级onload of ng-include。像这样:

在你的顶层,没有ng-if=> 只有 2 层深

<ul>
    <li ng-repeat="(key,value) in json" 
     ng-include="'node.html'" onload="parent=$parent.$parent"></li>
</ul>

在你的子级别中,有ng-if=> 3 层深:

    <ul ng-if="isObject(value)">
        <li ng-repeat="(key,value) in value" 
ng-include="'node.html'" onload="parent=$parent.$parent.$parent"></li>            
    </ul>

在模板内部,您可以使用以下方式访问父级:parent,祖父母使用parent.parent等等。

DEMO http://jsfiddle.net/C6E3k/1/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ng-repeat 中递归迭代时如何获取 ng-include 中的父元素 的相关文章

随机推荐

  • 如何在不打开摄像机的情况下录制视频?

    如何在不打开任何相机的情况下录制视频 我的要求是 当一个人遇到问题时 他的视频会被记录下来 但不是通过打开摄像头 它应该在后台工作 Thanks Use AV基础框架 http developer apple com library ios
  • 按特定字形划分字体子集

    我有一个 14MB 的 TTF 其中大部分是简体中文字符 我想通过创建一个仅包含 HTML 页面中特定字符的子集来减小大小 因此 理想情况下 我想向 Linux 程序传递一段文本 并让它根据包含的字符重新创建字体 E g magic fon
  • 为什么按值返回列表初始化对象时不调用复制构造函数?

    据我了解 当从函数按值返回对象时 会调用它们的复制构造函数 如果类具有已删除的复制构造函数 则按值返回将失败 struct X X const X delete X f return X error call to deleted cons
  • 有人看到我的港口号的正则有什么问题吗?

    我为端口号做了一条正则 在您说这是一个坏主意之前 它都会陷入更大的url正则义务 这比听起来要难得多 我的同事说这真的很糟糕 不会抓住一切 我不同意 我相信这个东西可以捕获从 0 到 65535 的所有内容没有其他的 我正在寻找对此的确认
  • 确保“重新启动”任务在其之前自动运行:测试

    是否有可能获得re start 又名重新启动 任务在运行 IntegrationTest 目标之前自动运行 it test 我以为这样就可以了 test lt lt test in IntegrationTest dependsOn reS
  • 如何在android中实现均衡器

    我必须在 android 中实现均衡器 我还发现源代码在这里 http kevinboone net android simple eq html 但我不知道 NumberOfBands 和 BandLevelRange 它们是什么 以及如
  • 临时更改 perl 系统调用中的默认 shell

    情况是这样的 在 Perl 中 我运行这个 my stat system cd somewhere source somescript bash do something else 对于我的所有用户 除了一名用户 来说 这都不是问题 但对于
  • .NET Framework 的目标版本与启动条件不匹配

    我有一个在 VS 2010 中构建的 C 项目 它通过 COM 引用 C 项目 这也是解决方案的一部分 上周五 我成功构建了一个版本 更改了一行代码 又进行了另一个构建 然后我开始收到有关 NET 的错误 项目中 NET Framework
  • 子例程中的默认参数值

    我不知道如何设置子例程的默认参数 这是我的考虑 sub hello print Hello world 如果您只需要一个参数 那么这很有效 如何为多个参数设置默认值 我本来打算这样做 sub hello my say 0 Hello my
  • 如何在 Java 中从内存中“清零”AES SecretKeySpec 密钥

    我正在使用 Java AES 加密 SecretKeySpec byte key String algorithm 生成一个Key对象 加密某些内容后 我想从内存中删除密钥 我可以删除对密钥的所有引用 但这并不能保证密钥不会浮动在内存中的某
  • 模型中默认范围内的参数

    我正在使用 Devise 来验证用户身份 我需要在所有表中显示 隐藏基于 global location id 列的数据 当前global location id的值将来自current user global location id 我尝
  • 使用 Azure BrokeredMessage 在不知道类型的情况下获取正文

    当您在 Azure 服务总线中使用中转消息时 可以通过调用 GetBody 检索消息正文 代码很简单 var msg subscription Receive MyPayload payload msg GetBody
  • 使用Spring JDBC的PreparedStatementCreator的正确方法是什么?

    据我了解 Java中PreparedStatement的使用是我们可以多次使用它 但是我在使用Spring JDBC的PreparedStatementCreator时有些困惑 例如考虑以下代码 public class SpringTes
  • PowerShell - 枚举集合并更改集合

    如何修复这个脚本 是的 我正在更改 foreach 循环中的集合 这就是此错误的原因 枚举集合时发生错误 集合已修改 枚举操作可能无法执行 在 C Users user Documents PowerShell ChangeAllLists
  • Android SSO Okta 集成示例

    对 Okta 和 Android 不太了解 有谁知道一个很好的教程 它展示了如何将 Android 应用程序连接到 Okta 框架中 或者我是否实施 SAML SSO 实施 然后将 Okta 与其关联 任何代码示例都值得赞赏 特别是显示通用
  • “ceq”MSIL 命令和 object.InternalEquals 之间的区别

    我在 ILDASM 和 Reflector 中进行了深入研究 发现 被编译为 ceq MSIL 命令 object Equals 保持原样 object Equals 调用 对象 InternalEquals This https stac
  • Laravel eloquent 不更新 JSON 列:数组到字符串的转换

    我想更新一个JSON我的数据库中的列 但我收到此错误 Array to string conversion 我已将列名称声明为array在模型中 protected casts destinations gt array 这是我使用的代码
  • 编译具有不同java源兼容性的项目

    我有一个包含 3 个不同项目的多项目配置 其中 2 个项目依赖于第三个项目 我将其命名为 核心 根据项目的不同 core 必须编译为 jar 分别与 1 4 和 1 6 兼容 输出为 core 1 4 jar 和 core 1 6 jar
  • 多次变基时一次又一次解决相同的冲突

    我正在使用 git 我正在分支上工作 假设它是分支A 当事情发生变化时master 我通常想要进行这些更改 我通过重新调整分支来做到这一点A 问题是 我在分支上有大约 50 60 次提交A每当微小的变化发生时master我需要进行变基并重新
  • 在 ng-repeat 中递归迭代时如何获取 ng-include 中的父元素

    我创建了一个递归 ng repeat 元素 并且尝试操纵事物变成了一场噩梦 因为我没有引用我正在迭代的父元素 ng repeat 看起来像这样 ng repeat key value in value 请记住 它是递归的 因此 value