46

这应该是一个非常简单的问题,但我发现的所有解决方法都很复杂。我在模板中使用 ng-repeat 循环遍历一组对象,如下所示:

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

由于 ng-repeat 创建了一个新范围,因此控制器中的“campaign”对象似乎不可访问。有什么方法(除了将活动对象添加到我数组中的每个项目之外)可以获得该值吗?

提前致谢。

4

3 回答 3

77

您可以使用 $parent 访问父范围

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>
于 2013-05-16T01:19:45.703 回答
3

这是一种不使用的有效方式$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当前范围内不存在,当您尝试访问它的属性时,Angular 会查看当前范围而不是给您一个错误(如果您只是尝试{{obj}}它将是未定义的,并且 Angular 会很高兴什么都不给你,而不是看更高的范围)。这是一个关于嵌套范围的有用链接:http ://www.angularjshub.com/examples/basics/nestedcontrollers/

在我的情况下,我需要track by $index,因为我有一个ng-model绑定到数组中的项目的输入,并且每当模型更新时,输入就会模糊,因为我认为 HTML 正在重新渲染。使用的结果track by $index是数组中具有相同值的项目将被重复。如果您修改第一个以外的其中之一,就会发生奇怪的事情。也许您可以过滤唯一性以避免这种情况。

我对 AngularJS 比较陌生,所以如果我遗漏了什么大的东西,请发表评论。但这有效,所以我至少在使用它。

于 2015-05-24T10:16:06.653 回答
3

另一种方法可能是将父范围作为范围变量传递给指令,即

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

这有点混乱,但你可以更好地控制父母的实际情况,并且可以传递任何东西。

于 2015-12-15T14:04:05.053 回答