带有ng-repeat(外部和内部),replace和templateUrl的自定义指令

时间:2016-02-15 19:29:50

标签: javascript angularjs angularjs-directive ng-repeat

我已经检查了各种资源,所有这些都导致很久以前关闭的错误。 Here是一个类似的问题,但我认为我的情况略有不同,并且至少持续达到angular.js 1.5。

我想验证,如果这是一个新的角度错误或者我错过了什么,因为我对角度相对较新。

我的问题

查看此plunker以获取问题的简短演示

我在<infos>

中有一个指令ng-repeat
<body ng-controller="MainCtrl" class="container">
  <div ng-repeat="item in items">
    <h2>{{item.title}}</h2>
    <infos></infos>
  </div>
</body>

<infos>指令在其第一个元素

上有一个ng-repeat
<div ng-repeat="(infoId, color) in item.infos">
  <p style="background: {{color}}">{{color}}</p>
</div>

该指令加载了templateUrlreplace:true

  .directive('infos', function() {
    return {
      restrict: 'E',
      replace: true,
      templateUrl: 'infos.html'
    };
  })

意外结果:

渲染时,周围ng-repeat的所有迭代的指令都在外部循环的最后ng-repeat上呈现,而不是在周围ng-repeat的每次迭代中呈现的预期。查看plunker演示,以便更好地了解,出现了什么问题。

变通方法

我找到了几个问题的解决方法:

  • 通过任何其他元素
  • 包装指令中的ng-repeat元素

<div>
  <div ng-repeat="(infoId, color) in item.infos">
    <p style="background: {{color}}">{{color}}</p>
  </div>
</div>
  • 离开replace: true
  • 使用template代替templateUrl。内联模板代码。
  • 使用<script type="text/ng-template" id="infos.html">...加载模板

可能有另一个解决方案,使用$templateCache但我无法弄清楚如何预加载模板。

0 个答案:

没有答案