EventSource インターフェイスから出力される次のデータを取得しました。このデータを使用して、Angular ng-repeat を使用して単純なテーブルを作成しています (以下のテーブル構造を指定しました)。私が抱えている問題は、データが急速に変化するためです。つまり、サーバーは要求されたシンボルの変更を継続的に送信し、値を更新し続けます。シンボルに対してデータが要求されたときに行を追加し、新しい値に対して同じ行を更新する必要があります。これはかなり簡単で、機能しています。
しかし、本当の課題は (少なくとも私にとっては) 別のシンボルを要求したときに、それを新しい 2 行目に追加し、これからは両方の行の値を更新する必要があることです。新しいシンボルをリクエストすると、それが続きます。次のデータ構造でこれが可能である場合は、説明してください。
データ構造:
data = [
AMZN: {
name: Amazon,
symbol: AMZN,
openPrice: $100,
latestPrice: $200,
percentage: 0.1
},
FB: {
name: Facebook,
symbol: FB,
openPrice: $150,
latestPrice: $250,
percentage: 0.2
}
]
テーブル構造:
<table>
<thead>
<tr>
<th>Session ID</th>
<th>Company Name</th>
<th>Symbol</th>
<th>Open Price</th>
<th>Latest Price</th>
<th>Percentage</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="stockVal in data">
<td>[Empty]</td>
<td>{{stockVal.companyName}}</td>
<td>{{stockVal.companySymbol}}</td>
<td>{{stockVal.openPrice}}</td>
<td>{{stockVal.latestPrice}}</td>
<td>{{stockVal.percentage}}</td>
</tr>
</tbody>
</table>
AMZN のリクエストを行うと、Amazon に関連する値がテーブルに入力され、FB をリクエストすると同じ行の値が置き換えられます。つまり、FB と AMZN の両方が同じ行で置き換えられます。肝心なのは、FB値を新しい行に入力したいということです。
コントローラーコード:
window.EventSource でエンドポイントをリクエストし、データを取得してスコープ オブジェクトにアタッチするだけです。n 個の行が入力されるのを避けるために、長さを 0 にするなど、毎回データ配列がフラッシュされます。
以下のコントローラーコードを追加すると、
$scope.generateData = _generateData;
function generateData() {
endPoint = '/getData'
$scope.symbols = window.document.getElementById('symbols').value;
var eventSource = new window.EventSource(endPoint + '?&s=' + $scope.symbols);
eventSource.onmessage = function(e) {
var data = null;
try {
data = JSON.parse(e.data);
} catch (err){
}
if(data) {
$scope.$apply(function () {
$scope.companyName = data.name;
$scope.companySymbol = data.symbol;
$scope.openPrice = data.openPrice;
$scope.latestPrice = data.latestPrice;
$scope.percentage = data.percentage;
});
var specData = {
[$scope.companySymbol]: {
name: $scope.companyName,
symbol: $scope.companySymbol,
openPrice: $scope.openPrice,
latestPrice: $scope.latestPrice,
percentage: $scope.percentage
}
}
$scope.data[0] = specData[$scope.companySymbol];
}
}
};