モデルデータを介して行がループするテーブルがあります。表のセルをクリックすると、その行のすべてのセルが切り替わります.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 メッセージが my array にプッシュされます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クラスを完全に失いますが、元の行が下にシフトされていても(一見ランダムに)元の行と同じ位置(2行目など)の新しい行に再表示されることがあります。 5 行目) に表示される新しい行は、追加されactive
たときに存在しませんでしactive
た。
例を投稿しますが、Plunkr も jsfiddle も NodeJS (WebSocket メッセージをプッシュする) をサポートしておらず、動作を示すために必要です。
解決
Alex's answerに基づいて、コントローラーを少し変更して 2 つ目の配列を追加しました。
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]
います (この 2 番目の配列の唯一の目的は、誰が選択/アクティブであるかを記憶することであるため、プロパティは必要ありませんactive
)。