我是Angular的新手,我正在做一个使用ngTable的应用程序:
var app = angular.module('myApp', ["ngTable"]).controller('mainController', function($scope, NgTableParams) {
$scope.data = [
{
a : "3",
b : "test"
},
{
a : "3",
b : "test"
},
{
a : "3",
b : "test"
}
];
$scope.tableParams = new NgTableParams({}, { dataset: $scope.data});
});
app.directive('appInfo', function() {
return {
restrict: 'E',
scope: {
info: '=infoData'
},
template:
" <tr> " +
" <td filter=\"{ a: 'text'}\" sortable=\"'a'\">{{info.a}}</td> " +
" <td filter=\"{ b: 'text'}\" sortable=\"'b'\">{{info.b}}</td> " +
" </tr> "
};
});
这是html:
<div class="main" ng-app="myApp" ng-controller="mainController">
<table ng-table="tableParams" class="table" show-filter="true">
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<app-info ng-repeat="info in data" info-data="info" />
</tbody>
</table>
</div>
问题是<app-info>
标记位于div
上方table
内而不是tbody
的错误位置。我错过了什么?
发生了什么事:
<div class="main" ...>
<app-info ... />
<app-info ... />
...
<table ...
</div>
什么是正确的:
<div class="main" ...>
<table ...>
<thead>...</thead>
<tbody>
<app-info ... />
<app-info ... />
...
</tbody>
...
</div>
答案 0 :(得分:3)
这是一个非常常见的问题,浏览器具有特殊的表格渲染方法,并且不适合角度。它会尝试渲染<table>
通过搜索tr
,td
,thead
等,然后点击不应该在这里的内容,例如app-info
。它会将未知元素放在table
之上,然后渲染其余元素。
解决它的一种方法是使你的指令成为属性而不是元素:
restrict: 'A',
<tbody>
<tr app-info ng-repeat="info in data" info-data="info">
</tr>
</tbody>
这样浏览器就不会删除app-info
,而angular会有时间正确呈现。
你可以在指令配置中理论上使用replace : true
,但它已被弃用,因为存在已知的错误:
replace ([DEPRECATED!], will be removed in next major release - i.e. v2.0)
答案 1 :(得分:2)
我认为浏览器不希望在Timer time = new Timer(1000 / 20, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean refresh = false;
switch (verticalMovement) {
case UP:
s2.changeY(UP);
refresh = true;
break;
case DOWN:
s2.changeY(DOWN);
refresh = true;
break;
default:
break;
}
switch (horizontalMovement) {
case RIGHT:
s2.changeX(RIGHT);
refresh = true;
break;
case LEFT:
s2.changeX(LEFT);
refresh = true;
break;
default:
break;
}
if (refresh == true) {
pane.repaint();
}
}
});
中包含app-info
标记。在Angular.js发挥其魔力之前,浏览器会尝试通过在表格外移动tbody
来“修复”无效的HTML。
您可以尝试更改app-info
并改为使用restrict: 'A'
。
但是,通常不希望在模板的根目录中使用与表相关的标记。