AngularJS :通过配置对象获取模板并多次显示该模板的指令

AngularJS : directives which take a template through a configuration object, and show that template multiple times

我想创建一个自定义指令,它将一个模板作为配置对象的 属性,并显示该模板给定的次数,并用页眉和页脚包围。创建此类指令的最佳方法是什么?

该指令将接收配置对象作为范围选项:

var app = angular.module('app');
app.directive('myDirective', function() {
  return {
    restrict: 'E',
    scope: {
      config: '=?'
    }
    ...
  }
}

此对象(称为配置)使用双向绑定选择性地传递给指令,如上面的代码所示。配置对象可以包括一个模板和一个数字,指示指令应显示模板的次数。例如,考虑以下配置对象:

var config = {
  times: 3,
  template: '<div>my template</div>'
};

当传递给指令时,它会导致指令显示模板五次(使用 ng-repeat。)指令还在模板上方和下方显示页眉和页脚:

<div>the header</div>
<div>my template</div>
<div>my template</div>
<div>my template</div>
<div>the footer</div>

实施此指令的最佳方法是什么?注意:当您回复时,请提供代码游乐场(例如 Plunker)中的工作示例,因为我 运行 对我探索过的每个可能的实现都存在问题。

更新,我探索过的解决方案包括:

  1. 使用指令的 link 函数附加头部、带有 ng-repeat 的模板和页脚。由于某些未知原因,这会遇到模板不重复的问题,整个解决方案似乎都是 hack。
  2. 将模板从配置对象插入到指令本身模板的中间。这被证明是困难的,因为 jqLit​​e 似乎已经从其基于 jQuery 的 API 中删除了 CSS 选择器的所有概念,这让我想知道这个解决方案是否是 "the Angular way."
  3. 使用编译功能构建出模板。这对我来说似乎是正确的,但我不知道它是否有效。

您确实可以使用 ng-repeat 但在您的指令模板中而不是在 link 中手动使用(因为不会被编译,因此不会重复)。

您没有回答的一个问题是,这个重复的模板应该由 Angular 编译和 link 编辑,还是仅 HTML 是静态的?

.directive('myDirective', function () {
    return {
      restrict: 'E',
      scope: {
        config: '=?'
      },
      templateUrl: 'myTemplate',
      link: function(scope) {
        scope.array = new Array(config.times);
      }
    }
  }

myTemplate 为:

<header>...</header>
<div ng-repeat="item in array" ng-bind-html="config.template"></div>
<footer>...</footer>

我想在这种情况下使用 ng-transclude,因为页眉和页脚包装器将由指令提供,内部内容应根据条件更改。

标记

<my-directive>
  <div ng-repeat="item in ['1','2','3']" ng-bind-html="config.template| trustedhtml"><div>
</my-directive>

指令

var app = angular.module('app');
app.directive('myDirective', function($sce) {
  return {
    restrict: 'E',
    transclude: true,
    template: '<div>the header</div>'+
                 '<ng-transclude></ng-transclude>'+
              '<div>the footer</div>',
    scope: {
      config: '=?'
    }
    .....
  }
}

过滤器

app.filter('trustedhtml', function($sce){
   return function(val){
      return $sce.trustedHtml(val);
   }
})