我正在尝试找到在与自定义指令一起使用的ngRepeat中获取索引位置的最佳方法。我试图解决的问题是,对于ngRepeat的每次迭代,我都想知道我在迭代中的位置,所以我可以根据索引位置创建自定义模板。
除非有更好的方法,否则我会尝试根据指令中的此文档执行此功能:
&安培;或& attr - 提供在父作用域的上下文中执行表达式的方法。如果未指定attr名称,则假定属性名称与本地名称相同。范围的给定和窗口小部件定义:{localFn:'& myAttr'},然后隔离范围属性localFn将指向count = count + value表达式的函数包装器。通常需要通过表达式将数据从隔离范围传递到父范围,这可以通过将局部变量名称和值的映射传递到表达式包装器fn来完成。例如,如果表达式是increment(amount),那么我们可以通过将localFn称为localFn({amount:22})来指定金额值。
http://docs.angularjs.org/guide/directive
我很难理解这句话告诉我的内容。所以,我试图做的就是这个......
首先将ngRepeat指令与我在“testTemplate”中的指令一起使用:
<ul>
<li my-attr="test()" my-directive ng-repeat="value in values" class="span2">
</li>
</ul>
接下来,我的指令定义了:
angular.module('myModule', [])
.directive('myDirective', function() {
return {
replace : true,
transclude : true,
scope : {
test: '&myAttr'
},
templateUrl: 'partials/myTemplate.html',
link : function(scope, element, attrs) {
alert(scope.count);
}
}
});
现在最后,我正在尝试在控制器中为引用该指令的父模板定义“test”函数。
function TestTemplateCtrl($scope, testTemplate) {
$scope.test = function() {
alert('in test');
$scope.count = "1";
}
}
所以第一个问题是我父母的“测试”功能根本没有被执行。也许我不理解如何调用父控制器中的测试功能。现在我实际上还没有增加,但是如果我能够解决测试功能,那么当我达到这一点时,我会采用正确的方法增加计数吗?
答案 0 :(得分:49)
您可以考虑将$ index作为指令属性传递而不是scope.$parent.$index
:
<li my-directive index="{{$index}}" ng-repeat="value in values">
指令:
myApp.directive('myDirective', function() {
return {
replace: true,
// transclude: true,
scope: {
index: '@'
},
template: '<div>testing {{index}}</div>',
link: function(scope, element, attrs) {
// ...
}
}
});
答案 1 :(得分:2)
正如您所指出的,您可以使用$ index来获取索引。
为什么你的测试函数没有触发,你没有执行它。在你的指令的链接功能中你需要像:
scope.$eval(attrs.myAttr);