问题描述
我正在尝试 re-use 在多个地方我的 HTML 视图的一部分。我想要 re-use 的部分是 HTML 表格中的表格单元格。问题是我的 ng-repeat 中的自定义指令正在做有趣的事情。我已经复制了 jsFiddle 的问题。 jsFiddle 中有两个 HTML 表。第一个是 ng-repeat,其中表单元素写入视图,第二个是来自指令 my-element 的表格单元格。 Chrome 开发工具会报告渲染的 HTML 格式如下。请注意,自定义元素仅显示一次,并且位于表外。
渲染 HTML
<div ng-controller="MyCtrl" class="ng-scope">
table1
<table class="table table-hover">
<tbody><!-- ngRepeat: p in people -->
<tr ng-repeat="p in people" class="ng-scope">
<td class="ng-binding">Name: Mike</td>
<td class="ng-binding">Age: 20</td>
</tr>
<tr ng-repeat="p in people" class="ng-scope">
<td class="ng-binding">Name: Peter S</td>
<td class="ng-binding">Age: 22</td>
</tr>
</tbody>
</table>
<br>table2
<my-element class="ng-binding">Name: Age: </my-element>
<table class="table table-hover">
<tbody>
<!-- ngRepeat: p in people -->
<tr ng-repeat="p in people" class="ng-scope">
</tr>
<tr ng-repeat="p in people" class="ng-scope">
</tr>
</tbody>
</table>
</div>
源 HTML
<div ng-controller="MyCtrl">
table1
<table class="table table-hover">
<tr ng-repeat="p in people">
<td>Name: {{ p.name }}</td>
<td>Age: {{ p.age }}</td>
</tr>
</table>
<br/>table2
<table class="table table-hover">
<tr ng-repeat="p in people">
<my-element></my-element>
</tr>
</table>
</div>
源 JS
var app = angular.module('myApp', []);
app.directive('myElement', function () {
return {
restrict: 'E',
template: '<td>Name: {{ p.name }}</td><td>Age: {{ p.age }}</td>'
}
});
function MyCtrl($scope) {
$scope.people = [{
name: 'Mike',
age: 20
}, {
name: 'Peter S',
age: 22
}];
}
请注意,jsFiddle 是一个简单的例子,常识将导致根本不使用指令。但是,我的目标代码有一个更大的模板,我想要 re-use 。我也试过使用”ng-include”,但结果是类似的。
最佳解决办法
已知<td>
在这样的指令中表现得很奇怪。而是在父<tr>
上使用指令。在这里阅读更多关于这个问题:https://github.com/angular/angular.js/issues/1459
<table>
<tr ng-repeat="p in people" my-element></tr>
</table>
这是您如何进一步改进您的指令,以便它是更多的 re-usable 。
app.directive('myElement', function () {
return {
scope: {
item: '=myElement'
},
restrict: 'EA',
template: '<td>Name: {{item.name}}</td><td>Age: {{item.age}}</td>'
};
});
并传递 item
的值,如下所示:
<table>
<tr ng-repeat="person in people" my-element="person"></tr>
</table>
Live Demo
次佳解决办法
将指令应用于<tr>
,如下所示:
<table class="table table-hover">
<tr my-element blah='p' ng-repeat="p in people"></tr>
</table>
app.directive('myElement', function () {
return {
restrict: 'A',
scope:{
ngModel: '=blah'
},
template: '<td>Name: {{ ngModel.name }}</td><td>Age: {{ ngModel.age }}</td>'
}
});
Working Demo
第三种解决办法
在您的指令中使用 replace: true
,您的<my-element>
将被替换为模板中的根项目<td>
,因此这不会混淆 HTML 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。