我创建了一个简单的指令,用于在< td>中显示一些文本.当没有表数据(即“找不到结果”)占用表的整个行时.之前我刚刚在< td>中有静态文本但是现在我想要把任何DOM放在它里面.我尝试添加ng-transclude到我的指令,但现在它是以奇怪的方式渲染元素.
这是我的指令:
app.directive('skNoResult',['$rootScope',function () { return { restrict: 'A',replace: true,transclude: true,template: '<tr ng-if="!hasResult"><td class="left" colspan="{{ colSpan }}"><ng-transclude></ng-transclude></td></tr>',link: function (scope,elem,attrs,ctrl) { var span = angular.element(elem).parents('tbody').siblings('thead').find('tr').children().length; scope.colSpan = span; scope.$watch(attrs.skNoResult,function (list) { if (list.length) { scope.hasResult = true; } else { scope.hasResult = false; } }); } }; }]);
它基本上只是跟踪数据集(数组),并检查长度以查看是否有任何数据.如果那里我们用ngIf显示这个行.
我的html看起来像这样
<tr sk-no-result="model.dataSet">Here is my text I want to transclude into my directive</tr>
问题是,被转录的文本被插入到DOM中,只是一个textNode,并且出现在< table>而不是内部.任何想法为什么会发生这种情况?
我相信你看到这个的原因不是因为Angular,而是浏览器看到它是无效的< tr>因为它期待< td>因此它会将此内容移动到表格之上,之后角度甚至有机会运行并进行交叉.您可以通过删除任何角色代码轻松测试,只需离开HTML,您会注意到结果完全相同.
以下是您可以使用的解决方法:
<tr ng-if="!model.dataSet.length"> <td sk-no-result="model.dataSet">Here is my text I want to transclude into my directive</td> </tr>
和指令:
app.directive('skNoResult',function () { return { restrict: 'A',template: '<td class="left" colspan="{{ colSpan }}"><div ng-transclude></div></td>',attrs) { var span = angular.element(elem).parents('tbody').siblings('thead').find('tr').children().length; scope.colSpan = span; } }; }])
注意,ngTransclude的元素使用,即< ng-transclude>< / ng-transclude>只能从版本1.3.0-beta.16及更高版本获得.如果您使用的是1.2版本,则需要使用上述示例中的属性使用情况< divng-transclude>< / div>
这是一个工作demo.