我正在尝试向表中添加一行“isrcrow”指令,如下所示:
<table class="table">
<thead><tr>
<th>Artist Name</th>
<th>Track Title</th>
<th>Version</th>
<th>Track Duration</th>
<th>Recording Year</th>
<th></th>
</tr>
</thead>
<tbody>
<isrcrow></isrcrow>
</tbody>
</table>
这是指令:
(function() {
var isrcorderapp;
isrcorderapp = angular.module("isrcorderapp", []);
isrcorderapp.controller("isrcordercontroller", function($scope, $http) {
return $scope.recordingTypes = [
{
type: 'Single'
}, {
type: 'Album'
}, {
type: 'Live'
}, {
type: 'Concert'
}, {
type: 'Instrumental'
}
];
});
isrcorderapp.directive("isrcrow", function() {
return {
restrict: 'E',
template: '<tr>\
<td><input id="artist" ng-model="name"/></td>\
<td><input id="track"/></td>\
<td><select id="isrctype" ng-model="isrctype" ng-change="setState(state)" ng-options="s.type for s in recordingTypes" class="ng-pristine ng-valid"></select></td>\
<td><input id="duration"/></td>\
<td><input id="year"/></td>\
<td><input type="button" value="Add ISRC" onclick="AddIsrc()" class="btn btn-small btn-success" />\
<input type="button" value="Delete" onclick="RemoveIsrc()" class="btn btn-small btn-danger" />\
</td>\
</tr>',
scope: {
name: '='
},
link: function(scope, element, attr) {}
};
});
}).call(this);
我遇到的问题是isrcrow指令不会在表体内呈现。它呈现在桌子之外和之上:
有谁知道造成这种行为的原因是什么?
答案 0 :(得分:30)
添加我的评论摘要作为答案,因为它似乎有助于OP。 : - )
正如GregL指出的那样,在replace: true
和restrict: 'E'
作为根模板节点的指令中省略<tr>
将导致无效标记,从而导致错误呈现这一行。
但是,对于使用1.2.13 (romantic-transclusion)之前的Angular版本的用户,由于已注明issue,此解决方案将不适用。
解决方法是将指令用作属性(即restrict: 'A'
)并适当修改模板,使<tr>
不再是根模板节点。这样就可以使用replace: true
。
答案 1 :(得分:7)
我猜这是因为你没有为replace: true
指令指定isrcrow
。因此,最终的标记看起来像:
<isrcrow>
<tr>
<td>...</td>
...
<td>...</td>
</tr>
</isrcrow>
哪个是<tbody>
的直接孩子,即invalid markup。因此,大多数现代浏览器(例如Chrome和我认为的Firefox)都会尝试通过将<isrcrow>
标记移到表格之外来“修复”您的标记。
相反,如果将replace: true
添加到指令规范中,则不会呈现<isrcrow>
元素,并且浏览器应该只看到有效标记而不是尝试“修复”它。
答案 2 :(得分:0)
之前的答案是正确的,但我发现它们有点难以理解/应用,所以总结了我是如何在他们的帮助下解决的:
表格
<tbody>
<tr isrcrow ng-repeat="..."></tr>
</tbody>
isrcow指令模板(没有tr,没有单根)
<td></td>
<td></td>
...
带有
的isrcrow指令restrict: 'A'
replace: false
最终结果是
<tbody>
<tr isrcrow>
<td></td>
<td></td>
...
</tr>
<tr isrcrow>
<td></td>
<td></td>
...
</tr>
...
</tbody>