在AngularJS中,如何使隔离范围继承ng-repeat的范围

时间:2012-11-19 08:09:42

标签: javascript angularjs

我正在尝试创建一个在ng-repeat循环中接收参数的自定义组件。 例如,假设我有一个名为“mycomp”的组件,它在ng-repeat中接收自定义参数“name”:

<mycomp name="{obj.name}" ng-repeat="obj in list" />

在我的指令中,隔离范围定义如下:

scope:{name:"@"}

这不起作用,因为ng-repeat为它迭代的每个元素创建一个独立的范围。所以我最终得到了两个范围。

如何解决此问题?我做错了吗?

感谢。

1 个答案:

答案 0 :(得分:16)

正如我在你对原始问题的评论中所述,这已经得到了解答。无论如何,总结一下:

在您的模板中,说明您要继承的模型,而不是{{}}(因为使用括号会导致传递的值,而不是对模型本身的引用):

<mycomp name="obj.name" ng-repeat="obj in list" />

在你的指令中,建立一个双向绑定,如下所示:

scope:{name:"="}

编辑:

我现在(在你的评论之后)意识到虽然这解决了你的问题,但它并没有完全回答这个问题。这是:

当您创建指令时,您可以选择创建一个从其父级继承的范围(控制器,通常,但不一定),“隔离”#34;范围,分别指定scope: truescope: {...}

因此,通过创建一个未隔离的范围,所有父模型都可用(您可以访问scope.obj - 通过ng-repeat创建 - 但也包括scope.list)。这当然很方便,但也很危险(并且并没有真正创建可重用的代码)。

如果您创建了一个隔离范围,则可以使用&#39; @&#39;,&#39; =&#39;来指定范围模型。或者&#39;&amp;&#39;。

&#39; @&#39;和&#39;&amp;&#39;两者都产生一个孤立的,未绑定的值,(如果你改变,只改变孤立的范围 - 在你的情况下,原始列表中的对象根本没有变化),唯一的区别是&#39; @& #39;读取字符串值,&#39;&amp;&#39;读一个表达式。 这是重要的:我认为您的代码无效的原因是(仅)因为您通过name="{obj.name}"而不是name="{{obj.name}}",因为&#39; @&#39 ;读取字符串值,该字符串值可以是obj的名称,但您必须将其包含在{{}}中!

如果使用&#39; =&#39;,则表示您希望该变量与指定的外部变量绑定。所以,如果(在一个疯狂的,疯狂的愤怒!)你想要在你的指令中有两个模型启动相同的值,但是绑定(即更改传播到外部范围),你可以做一些事情像这样:

<mycomp binded-name="obj.name" unbinded-name="{{obj.name}}" ng-repeat="obj in list" />

并在你的指令中:

scope:{
  bindedName: "=",
  unbindedName: "@"
}