Angularjs ng开关和ng在同一元件上重复

Angularjs ng开关和ng在同一元件上重复,angularjs,ng-repeat,ng-switch,Angularjs,Ng Repeat,Ng Switch,我在Angular中遇到了我没有预料到的行为,这篇文章的目的是找出这是一个bug还是有意的,并可能解释为什么它是有意的 首先看到这个Plunkr:。在这个示例中,我创建了一个名为array的数组,其中包含三个对象条目。此外,我还根据输入字段(称为toggle)的内容创建了一个ng开关。当toggle的值为1时,它应打印以“1”为前缀的数组中对象的所有名称,否则应以“其他”为前缀 这不符合预期,因为它显示了一个错误: Error: Argument '?' is required at asser

我在Angular中遇到了我没有预料到的行为,这篇文章的目的是找出这是一个bug还是有意的,并可能解释为什么它是有意的

首先看到这个Plunkr:。在这个示例中,我创建了一个名为array的数组,其中包含三个对象条目。此外,我还根据输入字段(称为toggle)的内容创建了一个ng开关。当toggle的值为1时,它应打印以“1”为前缀的数组中对象的所有名称,否则应以“其他”为前缀

这不符合预期,因为它显示了一个错误:

Error: Argument '?' is required at assertArg 
但是,同样的示例重写()并在列表中添加了一个额外的div,ng开关移动到此div,并且当ng开关从li移动到ul时(将ng重复和ng开关分开),ng开关确实按预期工作

有人能解释一下为什么会这样吗

这是“有意的”,因为这是重复的结果。本质上,标记的多个副本被克隆(ng repeat中的标记被用作模板),并针对正在迭代的每个元素单独编译。因此,angular基本上是在class='1'..>和3
  • 时编译3
  • 通过检查生成的标记,可以看到这种情况:

    <ul ng-switch="" on="toggle">  
      <!-- ngRepeat: entry in array -->
      <!-- ngSwitchWhen: 1 -->
      <!-- ngSwitchWhen: 1 -->
      <!-- ngSwitchWhen: 1 -->
      <!-- ngRepeat: entry in array -->
      <!-- ngSwitchDefault:  -->
      <!-- ngSwitchDefault:  -->
      <!-- ngSwitchDefault:  -->        
    </ul>
    

    这两个指令-ng repeat和ng switch-都应该小心处理,因为它们(不同于,例如,ng show或ng hide)严重影响结构。第二个(工作)PLUNKR是一种方法-仅在ng开关逻辑之后(结构方面,内部)使用指令。

    两个PLUNKR的结构似乎完全相同,只是名称从数组更改为流。你确定你没有犯错误吗?虽然我完全有可能犯了错误,但第一个是错误的,而第二个不是。我不明白第一个怎么了。啊,谢谢你的提醒。我一定是在叉/存东西时出错了。它是固定的,现在不工作了。(我现在明白蒂亚戈的意思了,对不起)