참조 할 내용은 plnkr입니다.지시문 템플릿에서 ngRepeat 사용
angular.module('app', function(){
})
.run(function($rootScope){
$rootScope.values = [1,2,3,4];
})
.directive('outer', function(){
return {
restrict:'E',
scope:{
items: '&'
},
replace: true,
template:'<div><inner items="items()"></inner></div>',
compile: function(){
return function(){
};
}
};
})
.directive('inner', function(){
return {
restrict:'E',
scope:{
items: '&'
},
replace: true,
template:'<div ng-repeat="item in items()">{{item}}</div>',
compile: function(){
return function(){
};
}
};
});
이것은 분명히 고의적 인 예이지만 문제를 강조 표시합니다. 몇 가지 레벨로 깊숙이 묻혀있는 지시문에 반복이 있습니다. 바깥 쪽 범위에서 컬렉션을 전달할 수 있습니다. 그러면 컬렉션이 정상적으로 반복됩니다. 그러나, 내가 실제로하고 싶은 것은 외부 지시자에게 컬렉션 대신에 외부 범위에 대해 실행할 수있는 ng-repeat 식 (item.ID로 값 추적 항목)을 전달하는 기능을 제공하는 것입니다. .
내부 지시어가 ng-repeat에 내장 된 로직을 활용하여 컬렉션이 변경 될 때 렌더링을 최적화 할 수 있기를 바랍니다.
내가 조사한 한 가지 옵션은 표현식으로 변수, 컬렉션 및 트랙을 직접 설정하는 ng-repeat의 새 버전을 만드는 것이지만 기존 구현을 활용하는 것이 분명합니다. 다른 옵션은 모든 인스턴스에 대해 $ compile을 사용합니다. 둘 다 가능하지만 좀 더 우아한 방법이 있기를 바라고 있습니다.
지시어에서'template'은 도움이되는 경우 속성에 액세스 할 수있는 함수가 될 수 있습니다. 또한 내부 지시어에 외부 지시자 컨트롤러가 필요하다고 생각할 수도 있습니다. 함수에'items'를 전달하면 위험 해 보입니다 ... 다이제스트 사이클에서는 비쌉니다. – charlietfl
도움이 될 수 있습니다. 표현식을 속성으로 전달하는 큰 문제는 적절한 범위에 대해 표현식을 평가하는 것입니다. 항목()에 동의하면 plnkr이 약간 단순화됩니다. –