Javascript AngularJS:如何在编译ng repeat指令模板之前获取它?

Javascript AngularJS:如何在编译ng repeat指令模板之前获取它?,javascript,angularjs,angularjs-directive,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Directive,Angularjs Ng Repeat,我正在尝试获取ng repeat指令的初始html模板,该指令在我的自定义指令中使用,该指令包含嵌套内容。但是,我得到的不是在指令中设置的实际html文本,而是已编译的ng repeat指令,或者只是一条如下所示的注释: <!-- ngRepeat: item in items --> 我当时已经问过这个问题了,但不幸的是,答案对我来说不是很清楚。有没有办法在编译ng repeat指令模板之前获取它 下面是一个简单的例子,说明我正在努力实现的目标(和一个目标): app.dir

我正在尝试获取ng repeat指令的初始html模板,该指令在我的自定义指令中使用,该指令包含嵌套内容。但是,我得到的不是在指令中设置的实际html文本,而是已编译的ng repeat指令,或者只是一条如下所示的注释:

<!-- ngRepeat: item in items -->

我当时已经问过这个问题了,但不幸的是,答案对我来说不是很清楚。有没有办法在编译ng repeat指令模板之前获取它

下面是一个简单的例子,说明我正在努力实现的目标(和一个目标):

app.directive('parent',function(){
返回{
限制:'E',
模板:“”,
是的,
优先权:1001,
范围:正确,
编译:函数(元素、属性){
log(element.html());
控制台日志(元素);
}
};
});

{{item}}

ng repeat
指令有“transclude:”element”,因此,在编译时,整个元素从DOM中取出(为转换做准备),并留下注释

因此,第一个
console.log(element.html())
将看不到任何内容,因为您自己的指令没有转换

但是,即使在链接时检查内部HTML,
ngRepeat
也会被编译,但它的转换还不会发生;当
ngRepeat
scope.$watchCollection
触发时,会发生这种情况

因此,查看内容的唯一方法是抢先编译
ngRepeat
。您可以使您的
parent
指令
terminal:true
,检查内容并手动重新编译

您还可以添加一个在可重复元素上运行的指令,其优先级高于
ngRepeat
,并获取内容

(您甚至可以重用
“ngRepeat”
名称)


你说得对-注释是编译的产物。在一天结束的时候,你到底想要实现什么。可能会有一个更简单的方法,因此我希望有一个指令,将ng repeat括起来并修改它(实际上它应该用dir paginate指令替换ng repeat)。这就是为什么我试图在编译之前检索最初的ng repeat,这似乎是一种奇怪的实现方法。为什么不首先使用正确的指令呢?但是,如果必须的话,您可以使用
terminal:true
和高于ngRepeat-priority的方法修改HTML,然后在内容上启动
$compile
,这条指令还包含一些其他内容,所以我认为这是唯一的方法。关于制作指令终端——它似乎不是那样工作的。我试图使外部指令终端以及指定的优先级高于ng repeat的优先级,但我得到的只是。看,可以使用它并使其工作,但您的问题是如何获得
ng repeat
的模板。因此,最好提出一个新问题,并明确具体要求。
app.directive('parent', function() {
  return {
    restrict:'E',
    template:'<div ng-transclude></div>',
    transclude: true,
    priority: 1001,
    scope: true,
    compile: function(element, attrs) {
      console.log(element.html());
      console.log(element);
    }
  };
});
<parent>
  <div ng-repeat="item in items">
    {{item}}
  </div>
</parent>
app.directive("ngRepeat", function(){
  return {
    require: "?^parent", // optionally require your parent
    priority: 1010,
    compile: function(tElem){
      var template = tElem.html();
      return function link(scope, element, attrs, ctrls){
         var parentCtrl = ctrls;

         if (!parentCtrl) return;

         // hand it off to the parent controller
         parentCtrl.setTemplate(template);
      }
    }
  }
})