加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 09:27:19 所属栏目:安全 来源:网络整理
导读:我创建了一个简单的指令,用于在 td中显示一些文本.当没有表数据(即“找不到结果”)占用表的整个行时.之前我刚刚在 td中有静态文本但是现在我想要把任何DOM放在它里面.我尝试添加ng-transclude到我的指令,但现在它是以奇怪的方式渲染元素. 这是我的指令: app
我创建了一个简单的指令,用于在< 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读