【发布时间】:2013-03-15 11:01:08
【问题描述】:
我有一个带有隔离作用域的指令(以便我可以在其他地方重用该指令),当我将此指令与 ng-repeat 一起使用时,它无法工作。
我已阅读有关此主题的所有文档和 StackOverflow 答案并了解这些问题。我相信我已经避免了所有常见的陷阱。
所以我知道我的代码由于ng-repeat 指令创建的范围而失败。我自己的指令创建了一个隔离作用域,并对父作用域中的对象进行双向数据绑定。我的指令将为这个绑定变量分配一个新的对象值,当我的指令在没有ng-repeat 的情况下使用时,这可以完美地工作(父变量已正确更新)。但是,对于ng-repeat,赋值会在ng-repeat 范围内创建一个新变量,而父变量看不到更改。根据我所阅读的内容,所有这些都符合预期。
我还读到,当给定元素上有多个指令时,只会创建一个范围。并且可以在每个指令中设置priority 来定义应用指令的顺序;指令按优先级排序,然后调用它们的编译函数(在http://docs.angularjs.org/guide/directive 搜索单词优先级)。
所以我希望我可以使用优先级来确保我的指令首先运行并最终创建一个隔离范围,并且当ng-repeat 运行时,它重新使用隔离范围而不是创建一个典型的范围从父作用域继承。 ng-repeat 文档指出该指令以优先级 1000 运行。尚不清楚1 是较高优先级还是较低优先级。当我在指令中使用优先级1 时,并没有什么不同,所以我尝试了2000。但这让事情变得更糟:我的双向绑定变成了undefined,而我的指令没有显示任何内容。
我创建了a fiddle to show my issue。我已经在我的指令中注释掉了priority 设置。我有一个名称对象列表和一个名为name-row 的指令,它显示名称对象中的名字和姓氏字段。单击显示的名称时,我希望它在主范围内设置 selected 变量。名称数组,selected 变量使用双向数据绑定传递给 name-row 指令。
我知道如何通过在主范围内调用函数来使其工作。我也知道,如果selected 在另一个对象内部,并且我绑定到外部对象,那么一切都会起作用。但我目前对这些解决方案不感兴趣。
相反,我的问题是:
- 如何防止
ng-repeat创建一个原型从父范围继承的范围,而是让它使用我的指令的隔离范围? - 为什么我的指令中的优先级
2000不起作用? - 使用 Batarang,是否可以知道正在使用的示波器类型?
【问题讨论】:
-
通常情况下,如果您的指令将与其他指令在同一元素上使用,您不希望使用隔离范围。由于您正在创建自己的范围属性,并且您需要使用 ng-repeat,因此我建议您使用
scope: true作为您的指令。另请参阅(如果您还没有)stackoverflow.com/questions/14914213/… 另外,仅仅因为指令将在多个地方使用并不意味着我们应该自动使用隔离范围。 -
我已经阅读了您的许多答案(它们非常出色,感谢您撰写它们),但我从未想过阅读您的问题 :-)。我读了你链接的内容。在我看来,隔离范围指令不能与其他指令混合。我同意这样的指令是组件的观点,因此它们不需要与其他指令混合。对我来说,一个例外(到目前为止)是
ng-repeat。我认为能够将独立指令与ng-repeat混合使用是很有价值的。待续…… -
从上面继续......所以如果应该只有一个指令具有一个元素的范围,那么
ng-repeat不应该有一个范围。ng-repeat有一个范围对于典型的用例来说确实有意义,所以我不建议改变它。相反,就像我在 Alex Osborn 的回答中评论的那样,我想我会创建一个基于ng-repeat的重复指令,它不会创建自己的范围。然后,这可以用于重复具有自己的隔离范围的指令。待续…… -
重复指令的代码现在需要知道是使用
ng-repeat还是自定义无作用域重复指令。我认为“调用者”知道这一点是可以的,但“被调用者”(被重复的指令)知道它是否被重复是不行的。待续…… -
对这里的 cmets 有点疯狂... :-) ngRepeat 必须 创建自己的范围。为什么你觉得你需要一个隔离作用域?
标签: angularjs angularjs-directive angularjs-scope angularjs-ng-repeat