angularjs – 使用ng-transclude在表中似乎不能正常工作

前端之家收集整理的这篇文章主要介绍了angularjs – 使用ng-transclude在表中似乎不能正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个简单的指令,用于在< 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.

猜你在找的Angularjs相关文章