【问题标题】:Dynamically select directive based on data根据数据动态选择指令
【发布时间】:2016-08-24 00:37:03
【问题描述】:

我正在尝试根据对象数组填充表格。这个数组不包含相同类型的对象,对于每一行,我想要一个完全不同的样式,并且 onclick 函数基本上是一个完全不同的行为。 例如,

var data=[
  {
    type:'dir-b',
    data: { ... }
  },
  {
    type:'dir-b',
    data: { ... }
  },
  {
    type:'dir-c',
    data: { ... }
  }
]

对于对象类型 dirB,我想要一个模板和控制器,而对于 dirC,我想要一个完全不同的函数和模板。

我找到的解决方案是创建 3 个指令。其中一个将运行以确定要根据数据添加的另外两个指令之一。

.directive("dirA", function($compile){
  return{
    restrict:'A',
    priority:1000,
    terminal:true,
    link: function(scope, element, attribute){
      element.removeAttr("dir-a");//prevent endless loop
      element.attr(attribute.type,"");
      $compile(element)(scope);
    }
  }
})
.directive("dirB", function($compile){
  return{
    restrict:'A',
    replace:true,
    link: function(scope, element, attribute){
        console.log("dirA");
    }
  }
})
.directive("dirC", function($compile){
  return{
    restrict:'A',
    replace:true,
    link: function(scope, element, attribute){
        console.log("dirC");
    }
  }
});

使用<tr dir-a type='{{d.type}}' ng-repeat='d in data'/> 没有达到预期的效果。要么我给 dirA 的优先级为 0,它可以解析属性,但它的重复次数超过数组大小,或者我给它的优先级为 1000,它不能解析 b.type 并将其用作文字。 有人对此有解决方案吗?

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-ng-repeat


    【解决方案1】:

    您可以在此处使用ngSwitch

    Plnkr

    HTML

    <div ng-repeat="(key, d) in data track by $index">
      <div class="tbody" ng-switch on="d.type">
        <div class="row" ng-switch-when="dir-b" dir-b>{{d}}</div>
        <div class="row" ng-switch-when="dir-c" dir-c>{{d}}</div>
      </div>
    </div> 
    

    然后您只需定义 dirBdirC 指令。

    虽然这不会显示为 html 表格,但您希望可以从中工作吗?

    【讨论】:

      【解决方案2】:

      不确定这是最好的解决方案,但这是我找到的解决方案。

      <table>
        <tbody ng-repeat='d in data'>
          <tr ng-if='d.type=="dir-b"' dir-b></tr>
          <tr ng-if='d.type=="dir-c"' dir-c></tr>
        </tbody>
      </table>
      

      这种方式由于 ng-if 只会显示正确的行,但问题是 tbody 将重复与数据中的行一样多的行。但在有更好的解决方案之前,我就是这样做的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 2019-12-30
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多