2013-05-15 52 views
42

这NG-重复循环应该是一个非常简单的问题,但我已经找到了解决方法是复杂的。我通过对象的数组中的模板使用NG-重复循环如下:通父范围值转换成角

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ campaign.name }} ... 
</div> 

由于NG重复创建一个新的范围,从控制器的“活动”对象似乎不可访问。除了将广告系列对象添加到数组中的每个项目之外,还有什么方法可以获得该值吗?

在此先感谢。

+2

它应该工作。是{{campaign.name}}在ng-repeat之外工作吗? – Anoop

+6

是NG-重复创建prototypically儿童范围从父范围继承,所以在父范围中定义的所有属性应该是在NG-重复子作用域可见。你有另一个指令定义在div或里面吗? –

+0

好的。我知道了。感谢你们的评论。 –

回答

72

您可以通过使用$父

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ... 
</div> 
+21

虽然这是真的,如果你正在做这样的说法,你正在做的事情有些不对劲。由于子范围原型从父范围继承,所以您不需要这样做。当代码增长并且你会发现自己正在编写'$ parent。$ parent。$ parent。$ parent.help()' –

+4

当你在$ parent上放置过度的时候,你应该确保尽量远离,在某些情况下,它会很有用。访问也在ng-repeat中的父亲的索引至少是我能想到的一个。

{{ $parent.$index }} {{ $index }}

+4

当然有次练习打理论=)。我确信可以有更多相关的例子,但是当我看到反模式时,我会感到负责任的警告,如果他们要使用它,他们应该知道还会发生什么。 –

1

这是不使用$parent一个可行的方式访问父范围。它通过嵌套的范围向上搜索以找到您正在使用的对象,但是它必须经过许多范围。

在包含列表的范围,你可以用列表定义对象的属性,像这样:

$scope.obj = {}; 
$scope.obj.items = ['item1','item2','item3']; 

然后让ng-repeat这个样子的:

<div ng-repeat="item in obj.items | filter:'item3' track by $index"> 
    {{obj.items[ obj.items.indexOf(item) ]}} 
</div> 

(您需要使用obj.items[ obj.items.indexOf(item) ]而不是obj.items[ $index ],因为$index是已过滤数组的索引,而不是原始数据)

这个工作的原因是因为虽然obj不会在目前的范围存在,因为你试图访问其属性,角看起来目前的范围之上,而不是给你一个错误(如果你只是试图{{obj}}这将是不确定的,而Angular会乐意给你任何东西,而不是通过更高的范围来观察)。这是关于嵌套作用域一个有用的链接:http://www.angularjshub.com/examples/basics/nestedcontrollers/

在我来说,我需要的track by $index,因为我有一个输入与ng-model数组中绑定到一个项目,并随时根据模型更新,输入将变得模糊,因为我觉得HTML正在被重新渲染。使用track by $index的后果是数组中具有相同值的项目将被重复。如果你修改第一个以外的其中一个,奇怪的事情将会发生。也许你可以过滤唯一性,以避免这种情况。

我是比较新的AngularJS,所以请评论,如果有什么大的我失踪。但是这个工作,所以我至少使用它。

+0

“只要你有ng模型,那里就必须有一个点” - [Misko Hevery](http://www.hirez.io/c/angular-2-preparation/e/episode-3-controller - )在3:34 – Rocco

2

另一种方法可能是通过父母范围为scope变量的指令,即

<my-directive 
    md-parent-scope="this" 
    ng-repeat="item in items"></my-directive> 

这是一个有点乱,但你必须在什么家长实际并可以传递任何更多的控制。