我有一个表,其行通过一些模型数据循环。单击表格单元格时,该行的所有单元格都会切换.active
(背景变为红色)。这很好用(尽管我最终会添加一个更复杂的检查器,.active
从所有行的兄弟姐妹中删除)。但是,我的表正在通过更新模型并导致重新绘制表的 WebSocket 推送/消息接收数据。发生这种情况时,我的“选择”就会丢失。
<tr ng-repeat="item in items | orderBy:'time':true">
<td
ng-click="items[$index].active =! items[$index].active"
ui-refresh="items[$index].active"
ui-jq="toggleClass"
ui-options="'active'"
>{{item.time | date:'hh:mm a'}}</td>
<td
ng-click="items[$index].active =! items[$index].active"
ui-refresh="items[$index].active"
ui-jq="toggleClass"
ui-options="'active'"
>
<a href="#/items/details/{{item.id}}">{{item.name}}</a>
</td>
</tr>
在我的控制器中,新的 WebSocket 消息被推送到我的数组中items
:
function Items($scope , WebSocket)
{
$scope.items = [];
WebSocket.on('items', function(data)
{// receive a bunch of items onload
$scope.items = data.items;
});
WebSocket.on('item', function(data)
{// receive subsequent items as they are pushed
$scope.items.push(data.item);
});
}
所以我想知道为什么items[$index].active
不通过 DOM 重新绘制(并保留其active
css 类)。此外,如果有人对我如何坚持我的“状态”有解决方案,那就太好了。
通常我会完全松开 css 类,但有时(看似随机)它会重新出现在与原始行相同的表格位置(例如第二行)的新行上,即使原始行已向下移动(到那么第 5 行是什么),并且添加active
时出现的新行不存在active
。
我会发布一个示例,但是 Plunkr 和 jsfiddle 都不支持 NodeJS(它会推出 WebSocket 消息)并且对于演示该行为是必要的。
解决方案
根据Alex 的回答,我稍微修改了我的控制器以添加第二个数组:
function Items($scope , WebSocket)
{
$scope.items = [];
$scope.rowSelection = [];// <- THIS IS NEW
WebSocket.on('items', function(data)
{// receive a bunch of items onload
$scope.items = data.items;
});
WebSocket.on('item', function(data)
{// receive subsequent items as they are pushed
$scope.items.push(data.item);
});
}
在我的模板中,交换items[$index].active
了rowSelection[$index]
(因为第二个数组的唯一目的是记住谁被选中/激活,它不需要active
属性)。