将父范围值传递到Angular中的ng-repeat循环

时间:2013-05-15 20:01:13

标签: javascript angularjs angular-template

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

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

由于ng-repeat创建了一个新范围,因此控制器中的“campaign”对象似乎不可访问。是否有任何方法(除了将广告系列对象添加到我的数组中的每个项目)获得该值?

提前致谢。

3 个答案:

答案 0 :(得分:75)

您可以使用$ parent

访问父作用域
<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>

答案 1 :(得分: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相对较新,所以请评论我是否有任何重大缺失。但这很有效,所以我至少要使用它。

答案 2 :(得分:3)

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

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

它有点混乱,但您可以更好地控制父实际上的内容并且可以传递任何内容。