【问题标题】:Transclude in Angular directive putting elements inside a single 'span'Transclude 在 Angular 指令中将元素放在单个“跨度”中
【发布时间】:2013-08-09 23:03:19
【问题描述】:

这是我的指令:

myapp.directive('envtable',  function () {
return {
    restrict: 'E',
    replace: true,
    transclude: true,
    template: '<table class="table" ng-transclude></table>'
};
});

这就是我在 html 中使用它的方式(使用 bootstrap css)

<envtable>
    <tr>
      <td>OS</td>
      <td>{{env.osName}}</td>
    </tr>
    <tr>
      <td>OS Version</td>
      <td>{{env.osVersion}}</td>
    </tr>
  </envtable>

但是,生成的代码在 chrome 中是这样的:

<table class="table" ng-transclude=""><span class="ng-scope ng-binding">

      OS
      Windows 8


      OS Version
      6.2

  </span></table>

如您所见,Angular 只是忽略了我所有的tr/td 标签,并将内容放在单个 span 元素中。为什么会这样?

顺便说一句,作为一个实验,我尝试在 envtable 中只使用一个嵌入的 p 标签而不是 tr\td 标签,在这种情况下,角度只是将一个 ng-scope 类添加到 p 标签。那么为什么会搞砸这些 tr/td 标签呢?

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    事实证明这适用于restrict: 'A'

    <table envtable>
        <tr>
            <td>OS</td>
            <td>{{env.osName}}</td>
        </tr>
        <tr>
            <td>OS Version</td>
            <td>{{env.osVersion}}</td>
        </tr>
    </table>
    

    Demo

    【讨论】:

    • 确实如此。但显然只有当属性添加到的元素是“表”而不是“div”时。知道为什么吗?
    • @pdeva table 指令有点特殊,因为它需要生成所有tbody 东西,可能生成与内部 tr 和 td 混淆了
    【解决方案2】:

    只需提供另一个示例,以防您的表格模板包含其他元素,例如 thead

    Plunker

    app.directive('envtable', function() {
      return {
        replace: true,
        transclude: true,
        template: '<table class="NewTable"><thead><th>Col1</th><th>Col2</th><th>Col3</th></thead></table>',
        link: function(scope, elem, attrs, controller, transcludeFn) {
          var item = transcludeFn(scope, function(clone) {
            return clone.children();
          });
          elem.append(item);
        }
      };
    });
    
    
     <table envtable>
        <tbody>
          <tr ng-repeat='r in rows'>
            <td>{{r.col1}}</td>
            <td>{{r.col2}}</td>
            <td>{{r.col3}}</td>
          </tr>
        </tbody>
      </table>
    

    【讨论】:

      【解决方案3】:

      我认为这可能会重复,但您的解决方案很简单。避免使用&lt;table&gt;

      如果您删除 &lt;table&gt; 标记,请将它们替换为 &lt;div&gt;display: table 样式,它应该可以正常工作。

      【讨论】:

      • 但是为什么使用 Table 会导致问题呢?
      • 在 GitHub 上查看此问题:github.com/angular/angular.js/issues/1459
      • 不知道为什么这会被否决,罗伊在这里有正确的答案。如果您尝试在 中进行嵌入,则浏览器和角度不知道如何处理数据。因此,开发 Angular 的人们的官方工作是将它们变成
        的 display: table
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多