我有一个带有隔离作用域的指令(这样我可以在其他地方重用该指令),当我使用这个指令与 ng-repeat
一起使用时,它无法正常工作。
我已经阅读了所有关于此主题的文档和 Stack Overflow 的答案,并理解了其中的问题。我相信我已经避免了所有通常的陷阱。
因此,我知道我的代码失败是由于 ng-repeat
指令创建的作用域。我的自定义指令创建了一个隔离作用域并对父作用域中的对象进行了双向数据绑定。我的指令将为此绑定变量分配一个新的对象值,在没有 ng-repeat
的情况下它可以正常工作(父变量被正确更新)。然而,在使用 ng-repeat
时,该赋值会在 ng-repeat
作用域中创建一个新的变量,父变量无法看到这个变化,这都是预期的结果。
我还了解到,当一个元素上有多个指令时,只会创建一个作用域。每个指令可以设置一个权重(priority
)来定义应用指令的顺序;指令按优先级排序,然后调用它们的编译函数(在 http://docs.angularjs.org/guide/directive 中搜索单词 "priority")。
因此,我希望使用优先级,以确保我的指令首先运行并创建一个隔离作用域,当 ng-repeat
运行时,它将重复使用该隔离作用域,而不是创建一个从父作用域原型继承的作用域。 ng-repeat
文档表明该指令在优先级1000
级别上运行。不清楚 1
是更高的优先级还是更低的优先级。当我在指令中使用 1
优先级时,它没有任何影响,所以我尝试了 2000
。但是这使情况变得更糟:我的双向绑定变为 undefined
,我的指令也没有显示任何内容。
我创建了一个演示我的问题的Fiddle。我已经在指令中注释掉了priority
的设置。我有一个名字对象列表和一个名为name-row
的指令,它显示名称对象中的名字和姓氏字段。当单击显示的名称时,我希望它在主作用域中设置一个selected
变量。名称数组、selected
变量均使用双向数据绑定传递给name-row
指令。
我知道如何通过调用主作用域中的函数来使其工作。我也知道如果selected
位于另一个对象内,并将其绑定到外部对象,则可以解决问题。但是我目前不感兴趣。
我的问题是:
- 如何防止
ng-repeat
创建从父级作用域原型继承的作用域,并改为使用我的指令的隔离作用域? - 为什么我的指令中优先级
2000
没有起作用? - 是否可以使用Batarang知道正在使用哪种类型的作用域?
scope:true
。另请参见(如果尚未)https://dev59.com/vWUp5IYBdhLWcg3w-LMJ。此外,仅因为指令将在多个位置使用并不意味着我们应该自动使用隔离作用域。 - Mark Rajcokng-repeat
。 我认为能够将独立指令与ng-repeat
混合使用是很有价值的。 待续... - Deepak Nulu