AngularJS ng Repeat指令没有编译选项

时间:2014-01-27 17:42:28

标签: angularjs

我发现source code指南中提到的HTML Compiler ngRepeat没有compile选项。

我对此感到困惑....

谁能告诉我为什么......

1 个答案:

答案 0 :(得分:6)

ngRepeat有一个转换选项。

  • 使用transclude时,$compile编译transcluded元素,然后为指令的链接函数提供childTranscludeFn函数作为第五个参数(或指令控制器中的$ transclude)
  • 此函数用于创建同一编译模板的多个克隆。
  • 只有在被转录时才编译一次。

来自compile.js source code的小代码片段:

if (directiveValue = directive.transclude) {

  // some code

  if (directiveValue == 'element') {

    // some code

    childTranscludeFn = compile($template, transcludeFn, terminalPriority,
                                replaceDirective && replaceDirective.name, {
                                  // some comments
                                  nonTlbTranscludeDirective: nonTlbTranscludeDirective
                                });
  } else {
     // some code
     childTranscludeFn = compile($template, transcludeFn);
  }
}

ngRepeat内:

  • 此指令监视集合的更改
  • 在更改时,它会迭代所有收集项目以查找新添加的项目(或已删除的项目)
  • 它将已删除的内容克隆到每个新项目的新子范围(使用$ transclude)

来自ngRepeat source code的片段:

var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
  var NG_REMOVED = '$$NG_REMOVED';
  var ngRepeatMinErr = minErr('ngRepeat');
  return {
    transclude: 'element',
    priority: 1000,
    terminal: true,
    $$tlb: true,
    link: function($scope, $element, $attr, ctrl, $transclude){

        // some code

        $scope.$watchCollection(rhs, function ngRepeatAction(collection){

          // some code

          for (index = 0, length = collectionKeys.length; index < length; index++) {

            // some code

            if (!block.scope) {
              $transclude(childScope, function(clone) {

                // some code

              });
            }
          }

          // some code
        });
    }
  };