2013-03-15 62 views
11

我在Angular中遇到过的行为我没有想到,本文的目的是要找出这是一个错误还是有意的,可能是解释它的目的。ng-switch和ng-repeat在相同的元素上相互影响

首先看到这个Plunkr:http://plnkr.co/edit/CB7k9r?p=preview。在这个例子中,我使用三个对象条目创建了一个名为array的数组。此外,我根据输入字段的内容(称为切换)创建了一个ng-switch。当toggle的值为1时,它应该打印数组中前缀为“1”的所有对象的名称,否则前缀为“other”。

按预期这不起作用的它显示了一个错误:

Error: Argument '?' is required at assertArg 

但是同样的例子重写(http://plnkr.co/edit/68Mfux?p=preview)与周围列表中的额外的div时,NG-开关移到这个div和NG -switch-当从li移动到ul时(将ng-repeat和ng-switch分开时)按预期工作。

有人可以解释为什么这是?

+0

这两个Plunkrs的结构似乎完全相同,除了名称从数组更改为流。你确定你没有犯错吗? – 2013-03-15 11:35:43

+0

虽然完全有可能我犯了一个错误,但第一个Plunker是错误的,而第二个不是。我不明白第一个错在哪里。 – Kevin 2013-03-15 11:49:15

+0

啊,感谢您的提醒。我一定犯了错误/保存。它现在已经修复http://plnkr.co/edit/CB7k9r?p=preview不起作用http://plnkr.co/edit/68Mfux?p=preview的确如此。 (我现在明白蒂亚戈意味着同样的事情,对不起) – Kevin 2013-03-15 12:50:21

回答

17

这是“故意的”,因为它是角度处理ng-repeat的产物。从本质上讲,克隆标记的多个副本(ng-repeat内部的标记用作模板),并针对每个要迭代的元素单独编译。因此,角度基本上是编译3 <li ng-switch-when='1' ....>和3 <li ng-switch-default ....>,但是在上下文之外 - 没有ng-switch-on元素可以进行比较。

你可以看到这种情况出现,通过检查结果标记:

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

两个指令 - NG-重复和NG-开关 - 应谨慎处理,因为它们(不像,例如,NG-秀或隐藏)严重影响结构。第二个(工作)Plunker是要走的路 - 只能在AFTER(结构方式,INSIDE)ng-switch逻辑的指令下工作。