【发布时间】:2016-03-17 08:02:23
【问题描述】:
我一直在开发一个 Angular 应用程序并且有一个相当长的列表(1600 多行)。下载列表时,我的应用程序冻结并需要很长时间(+/- 10 秒)才能显示数据。 我认为这是不对的,并且在互联网上找到了一些解决方案。然而,这些提示似乎不会影响加载时间。
在加载时,我查看了 Google Chrome 中的开发工具,这给了我这个奇怪的结果:
您可以看到加载后应用程序冻结并需要超过 5 秒才能恢复。
我在这里调用的函数如下:
function loadInschrijvingen(activiteit_id, module_id, periode_id, groep_id){
inschrijvingService.getInschrijvingenById(activiteit_id, module_id, periode_id, groep_id).then(function(response){
applyInschrijvingen(response);
});
}
对应的服务功能:
function getInschrijvingenById(activiteit_id, module_id, periode_id, groep_id){
var request = $http({
url: API_URL + 'inschrijvingen',
method: 'GET',
params: {activiteit_id: activiteit_id, module_id: module_id, periode_id: periode_id, groep_id: groep_id}
});
return (request.then(handleSuccess, handleError));
}
url 只是一个普通的数据库查询来获取行。 过滤也是一团糟。搜索行需要 5 秒,同时只过滤姓氏。
<input type="text" placeholder="zoeken op achternaam" ng-model="inschrijving.achternaam" ng-model-options="{debounce: 500}">
<tr class="fold new" ng-repeat="inschrijving in inschrijvingen | filter: inschrijving track by inschrijving.id">
<td>@{{$index+1}}</td>
<td><span ng-click="toggle('edit', inschrijving.id)"></span></td>
<td><span ng-click="confirmMail(inschrijving.id)" title="Inschrijvingsmail herzenden"></span></td>
<td><span ng-click="confirmReminder(inschrijving.id)" title="Betalingsherinnering verzenden"></span></td>
<td><span ng-click="confirmDelete(inschrijving.id)"></span></td>
<td>@{{inschrijving.voornaam}} @{{inschrijving.achternaam}}</td>
<td><a href="mailto:@{{inschrijving.email}}">@{{inschrijving.email}}</a></td>
<td>@{{inschrijving.geboortedatum | date:'dd/MM/yyyy'}}</td>
<td><i class="fa" ng-class="{'fa-male': inschrijving.geslacht == 'man', 'fa-female': inschrijving.geslacht == 'vrouw'}"></i></td>
<td>@{{inschrijving.straat}}, @{{inschrijving.postcode}} @{{inschrijving.gemeente}} </td>
<td>@{{inschrijving.gsm}}</td>
<td><input type="checkbox" ng-model="inschrijving.betaald" ng-true-value="1" ng-false-value="0" ng-checked="inschrijving.betaald == 1" ng-change="setState(inschrijving.id, 'postBetaald')"></td>
<td>
<select name="betalingswijze" id="betalingswijze" ng-model="inschrijving.betalingswijze" ng-change="setState(inschrijving.id, 'postBetalingswijze')">
<option value="0" ng-selected="inschrijving.betalingswijze == 0">Geen</option>
<option value="1" ng-selected="inschrijving.betalingswijze == 1">Cash</option>
<option value="2" ng-selected="inschrijving.betalingswijze == 2">Overschrijving</option>
</select>
</td>
<td><input class="bedrag" type="text" value="@{{inschrijving.bedrag}}" ng-model="inschrijving.bedrag" ng-change="setState(inschrijving.id, 'postBedrag')" ng-model-options='{ debounce: 1000 }'></td>
<td><input type="checkbox" ng-model="inschrijving.fotos" ng-true-value="1" ng-false-value="0" ng-checked="inschrijving.fotos == 1" ng-change="setState(inschrijving.id, 'postFotos')"></td>
<td>
<select name="tshirtmaat" id="tshirtmaat" ng-model="inschrijving.tshirtmaat" ng-change="setState(inschrijving.id, 'postTshirtmaat')" >
<option value="" ng-selected="inschrijving.tshirtmaat == ''"></option>
<option value="92" ng-selected="inschrijving.tshirtmaat == 92">92</option>
<option value="L" ng-selected="inschrijving.tshirtmaat == 'L'">L</option>
</select>
</td>
<td>@{{inschrijving.opmerkingen}}</td>
</tr>
我真的很困惑,所以如果有人可以帮助我吗?
【问题讨论】:
-
1600+ 行是要渲染的大量 HTML。我会添加分页。
-
分页时,行是分部分加载的吗?我试试看
-
这是一种方法,是的。另一种是将完整的集合返回给客户端,然后查询该数据集。 UI Bootstrap 非常适合这个。 angular-ui.github.io/bootstrap/#/pagination 和 angular-ui.github.io/bootstrap/#/typeahead 非常适合您的搜索。
标签: javascript angularjs performance