gpt4 book ai didi

javascript - 嵌入包含 ng-binds 的 HTML

转载 作者:行者123 更新时间:2023-12-03 11:11:12 26 4
gpt4 key购买 nike

我正在研究一个 Angular Directive(指令)来总结 ng-table具有一些过滤/导出功能。它的目的是可重用于多个表,因此 <td>元素必须是动态的。我正在尝试使用 ng-transclude 来处理这个问题

问题是我的<td>元素需要一些指令,例如 ng-bind , data-title ,和sortable 。当它们试图被指令嵌入时,它们已经被渲染为空值。我需要一种方法来防止 <td>行从被渲染到被插入到指令中

这是我的 View 标记:

<div>
<my-data-table search-filter="ss" table-values="mvData">
<td data-title="'UUID' | translate" sortable="'id'" ng-bind="row.uuid | shortUuid"></td>
<td data-title="'DEVICE.UNAME' | translate" sortable="'uname'" ng-bind="row.uname"></td>
<td data-title="'DEVICE.LOGIN' | translate" sortable="'last_login'">{{{true: (row.last_login | selectedTimezone | moment:'MMM D, YYYY h:mma'), false: 'N/A'}[!!row.last_login]}}</td>
</my-data-table>
</div>

指令模板:

<div class="row">
<div class="col-sm-12">
<table ng-table="mvData.tableParams" class="table table-striped table-hover table-bordered" template-pagination="src/tables/responsive-pager.html">
<tr ng-repeat="row in $data">
<div ng-transclude></div>
</tr>
</table>
</div>
</div>

指令声明:

angular.module('myApp')
.directive('myDataTable',function() {

return {
restrict:'E'
, templateUrl:'src/tables/myDataTable.tpl.html'
, transclude:true
, scope: {
searchFilter:'='
, tableValues:'='
}
, link:function(scope,el,attr,ctrls) {
console.log('hello world');
}
}
});

最佳答案

部分问题在于,当您将表和列拆分为指令并嵌入内容时,Angular 会感到困惑,因为它会尝试对无效 HTML 进行 DOM 操作(<td> 元素不能存在于 <table> 之外)。和 <tr> 元素)。

要解决这个问题,您需要执行以下操作:

  1. 而不是<td>在嵌入的内容中,您需要更改这些到<div> (稍后将替换为<td>)

  2. 您的模板声明将更加复杂,以便您将模板完全构建为字符串。在这里,您可以执行逻辑来创建所需的 HTML。将此字符串模板传递给 Angular 后,所有其余的机制都应该可以工作。本质上,您是在手动嵌入内容。

以下示例包含 ng-table 声明,但为简单起见不包含 ng-table 指令:

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
</head>
<body ng-app="myApp">
<div ng-controller="MainCtrl">
<my-data-table search-filter="ss" table-values="mvData">
<div data-title="'UUID' | translate" sortable="'id'" ng-bind="row.uuid"></div>
<div data-title="'DEVICE.UNAME' | translate" sortable="'uname'" ng-bind="row.uname"></div>
<div data-title="'DEVICE.LOGIN' | translate" sortable="'last_login'"></div>
</my-data-table>
</div>
</body>
<script>
var app = angular.module('myApp',[]);

app.controller("MainCtrl", function($scope){
$scope.mvData= {
$data : [
{uuid : 'abc', uname : 'test'},
{uuid : 'abc1', uname : 'test1'},
{uuid : 'abc2', uname : 'test2'},
{uuid : 'abc3', uname : 'test3'}
]
};
})

app.directive('myDataTable',function() {
return {
restrict:'E',
template : function(elem, attr){
var startStr =
'<div class="row">' +
'<div class="col-sm-12">' +
'<table ng-table="mvData.tableParams" class="table table-striped table-hover table-bordered" template-pagination="src/tables/responsive-pager.html">' +
'<tbody><tr ng-repeat="row in tableValues.$data">';
var endStr = '</tr></tbody>' +
'</table>' +
'</div>' +
'</div>';

var template = startStr;
var colStr;
angular.forEach(elem.find("div"), function(item){
colStr = item.outerHTML.replace('<div ','<td ').replace('</div>','</td>');
template = template + colStr;
});

template = template + endStr;
return template;
},
scope: {
searchFilter:'='
, tableValues:'='
},
}
});



</script>

</html>

关于javascript - 嵌入包含 ng-binds 的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com