ng-repeatを使用して作成されたテーブルが600または700までの数百の行にあります。各行にはチェックボックスがあり、 1つのボックス内のすべてのチェックボックスをオンにします。しかし、私はブラウザのパフォーマンスの問題にぶち当たっています。特にIE11(クライアントが選択したもの)は特に反応しなくなります。数分後にすべてのチェックボックスがチェックされているように見えますが、それでもスクロールしたり何もしないので効果的ではありません。角1:大規模なng-repeatのすべてのチェックボックスをチェック
コントローラアレイを作成しました。checkAllボックスをクリックすると、モデル(ng-repeatで使用されているもの)をループし、配列に値を追加します。私はそれが減速の原因となっているアレイを介してループしていると推測しますが、わかりません。改ページは除外されており、1ページにすべての行が必要です。ここで
<table>
<tbody>
<tr>
<th>Table Header</th>
<th><input type="checkbox" id="checkAllCheckBox" ng-model="vm.allChecked" ng-change="vm.tickOrUntickAllCheckBoxes()" />
</tr>
<tr ng-repeat="payment in vm.payments>
<td>{{ payment.somePaymentValue }}</td>
<td>
<input type="checkbox" class="paymentsApprovalCheckbox"
ng-checked="vm.approvedPayments.indexOf(payment.payId) > - 1"
ng-value="payment.payId" ng-model="payment.approved"
ng-click="vm.handleCheckBoxClick(payment.payId)" />
</td>
</tr>
</tbody>
</table>
はすべて
vm.tickOrUntickAllCheckBoxes = function(){
if (vm.allChecked == false) {
vm.approvedPayments = [];
} else {
vm.payments.forEach(function(payment){
vm.approvedPayments.push(payment.payId);
});
}
};
は、昔ながらのjavascriptオプションの角度vm.tickOrUntickAllCheckBoxes()関数は、しかし、IE11でほぼ瞬時checkAllボックスの作業を行いスワップアウト/チェックを解除を確認し、角度の関数であります私は、確認されたpayment.payId値へのアクセスを失います。私はそれらを得るために角に離れているのだろうか?ここでは、プレーンJavaScriptのcheckAll()関数は次のとおりです。
<script>
function checkAll(x) {
var checkBoxes = document.getElementsByClassName('paymentsApprovalCheckbox');
for (var i = 0; i < checkBoxes.length ; i++) {
checkBoxes[i].checked = (x.checked == true);
}
}
</script>
それから私はこのようなcheckAllチェックボックス更新:あなたは個別に1つのチェックボックスをチェックすると
<input type="checkbox" id="checkAllCheckBox" ng-model="vm.allChecked" onclick="checkAll(this)" />
をその後、NG-モデルは= "payment.approved"繰り返すチェックボックスの中のチェックボックスは更新されますが、checkAll関数でチェックされている場合は発生しません。 checkAll()でチェックしたボックスを角度で検出することは可能ですか?私はこれが、ちょっと遅れて、同じ年を必然的に遅くすることをやめていると思う。
誰でも任意のアイデアや回避策がありますか?ありがとう!
これは角度1の脆弱性の1つです。汚れたチェックメカニズムのため、何百行ものレコードごとに何百ものレコードの中で 'indexOf()'関数をほぼ連続して実行します。それはそれぞれの再塗装のための数十万の操作です。 'indexOf()'を実行する代わりに、 'indexOf()'の結果をキャッシュして一度だけ実行するような真偽値をどこかに格納する方法を見つけるべきです。 –
私は過去に "仮想"リストを使ってAngular 1の大きなリストパフォーマンスの問題を解決しました。考えられるのは、画面上の目に見えるアイテムだけがレンダリングされるため、膨大なパフォーマンス上の問題を引き起こす可能性のある何百もの不要なバインディングが節約できます。 "角の仮想スクロール"のためのGoogleの検索を行い、あなたはいくつかのオプションを見つけることができます。 – james00794