这应该是一个非常简单的问题,但我发现的所有变通方法都很复杂。我在模板中使用ng-repeat循环遍历一组对象,如下所示:
<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'">
{{ message.subject }} ... {{ campaign.name }} ...
</div>
由于ng-repeat创建了一个新范围,因此控制器中的“campaign”对象似乎不可访问。是否有任何方法(除了将广告系列对象添加到我的数组中的每个项目)获得该值?
提前致谢。
答案 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>
它有点混乱,但您可以更好地控制父实际上的内容并且可以传递任何内容。