$ index of ngRepeat внутри директивы angularjs
Я пытаюсь найти лучший способ получить позицию индекса в ngRepeat, используемую с пользовательской директивой. Проблема, которую я пытаюсь решить, заключается в том, что для каждой итерации ngRepeat мне бы хотелось узнать, где я нахожусь на итерации, поэтому я могу создать собственный шаблон на основе этой позиции индекса.
Если нет лучшего способа сделать это, я пытаюсь сделать эту функциональность на основе этой документации из директив:
& или & attr - обеспечивает способ выполнения выражения в контексте родительской области. Если имя attr не указано, предполагается, что имя атрибута совпадает с локальным именем. Определенное и видимое определение области: {localFn: '& myAttr'}, затем изолировать свойство scope localFn будет указывать на оболочку функции для выражения count = count + value. Часто желательно передавать данные из изолированной области через выражение и в родительскую область, это можно сделать, передав карту локальных имен переменных и значений в оболочку выражения fn. Например, если выражение является приращением (суммой), мы можем указать значение суммы, вызвав 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";
}
}
Итак, первая проблема заключается в том, что моя "тестовая" функция в родительском объекте вообще не выполняется. Возможно, я не понимаю, как следует вызывать тестовую функцию в родительском контроллере. Теперь я еще не увеличился, но вернее ли это, если я смогу запустить тестовую функцию, чтобы увеличить огонь,
Ответы
Ответ 1
Вместо scope.$parent.$index
вы можете рассмотреть возможность передачи $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) {
// ...
}
}
});
Fiddle.
Ответ 2
Как вы указали, вы можете захватить индекс с помощью $index.
Как ваша тестовая функция не срабатывает, вы ее не выполнили. В вашей функции директивной ссылки вам нужно что-то вроде:
scope.$eval(attrs.myAttr);