表行的AngularJS指令中的动态“模板”

时间:2014-03-06 01:23:27

标签: javascript html angularjs angularjs-directive

在表格中工作时,我可以动态加载AngularJS指令templateUrl吗?

我有以下HTML,用tr指令重复fw-rule

<tbody>
  <tr ng-repeat="rule in data | orderBy:predicate:reverse" fw-rule="rule">
  </tr>
</tbody>

我希望tr的内容不同,具体取决于“编辑”变量的状态。

我的部分内容是下面的(另一个是布局的变化):

<td><input type="checkbox"></td>
<td ng-click="isEditing=!isEditing">{{ fwRule.name }}<br><span class="rule-description">{{ fwRule.description }}</span></td>
<td>{{ fwRule.source }}</td>
<td>{{ fwRule.destination }}</td>
<td>{{ fwRule.protocol }}</td>
<td>{{ fwRule.schedule }}</td>
<td>{{ fwRule.action }}</td>
<td>{{ fwRule.reporting }}</td>

我在SO上回顾了以下两个问题,几乎给了我答案:

但是,他们都要求使用template编写指令<div ng-include"getTemplateUrl()"></div>,如下所示:

app.directive('fwRule', function () {
  return {
    restrict: 'A',
    scope: {
      fwRule: '='
    },
    controller: function ($scope) {
      $scope.getTemplateUrl = function () {
        // a check would be made here to return the appropriate partial
        return 'partials/RuleEditTableRow.html'
      }
    },
    link: function (scope, element, attrs) {
    },
    template: '<div ng-include="getTemplateUrl()"></div>'
  };
});

这在我的情况下不起作用,因为div不是tr的有效子项(也是span,我也尝试过)。因此,浏览器会在表格外部呈现该内容。

有没有一种方法可以动态更新指令的template,而不使用ng-include,以便它可以在表格中运行?

1 个答案:

答案 0 :(得分:0)

您可以使用$ compile服务编译正确的模板

app.directive('fwRule', function ($compile) {
    return {
        restrict: 'A',
        scope: {
            fwRule: '='
        },
        controller: function ($scope) {},
        link: function ($scope, element, attrs) {
            var template = '<td>cell 1</td><td>cell 2</td>';

            angular.element(element).html(template);
            $compile(element.contents())($scope);
        }
    };
});

我认为我在这个小提琴中使用了你的代码:http://jsfiddle.net/ztv5gwwx/4/