我是AngularJS的新手。我开发了一个列表,可以在搜索框中输入时进行过滤。过滤器从数据库对象中获取许多字段并搜索所有这些字段(例如:name,id,comments ...等)。 当我加载所有查询集并使用(push)命令填充angular方法中的列表时,会出现问题。 因为我在数据库中有相当数量的记录,所以加载页面大约需要12秒,而且数据库正在增加,所以这个时间会增长! 我使用时间线测试了性能,正如预期的那样,脚本需要很长时间!
这是我的一段代码:
模板
<script type="text/javascript">
ngApp.controller('FilterCtrl', function ($scope) {
$scope.lines = [];
{% for line in lines %}
$scope.lines.push
({
id:{{ line.id }},
name: '{{ line.name }}',
alias: '{{ line.alias }}',
owners: '{{ line.print_owners }}',
interested_in: '{{ line.print_interested_in }}',
crosses_count: '{{ line.related_crosses_count }}',
area: '{{ line.expressions }}',
});
{% endfor %}
});
</script>
的观点:
def browse_lines(request):
lines = Line.objects.filter(deleted=False).order_by('name')
return render_to_response('Browse_Lines.html',
{'lines': lines },
context_instance=RequestContext(request))
有什么方法可以提高性能并加快填写清单的速度? 非常感谢你。
答案 0 :(得分:2)
没有办法'加速'。
最好的方法是对表进行分页,以便最初只为第一页加载数据。比如,你有1000个项目,将它分成每个100个项目的页面。因此,最初只会提取前100个项目。当你转到另一个页面接下来的100个项目等等。
此外,对于过滤,您将编写一个api端点,该端点将接受过滤器查询并从数据库返回项目。然后在表格中显示这些项目。至于何时点击此API,请使用ngChange
,ngModel
和ngModelOptions
(用于去抖动)的组合,如下所示:
<input type="text" ng-model="search.query" ng-change="getItems()" ng-model-options="{debounce: 1000}" />
这里,当用户键入某个内容并等待1秒(由debouce处理)时,将调用getItems()
。在该功能中,将search.query
发送到api。
答案 1 :(得分:2)
一个快速的胜利就是一个接一个地把东西推到阵列
$scope.lines = [
{% for line in lines %}
{
id:{{ line.id }},
name: '{{ line.name }}',
alias: '{{ line.alias }}',
owners: '{{ line.print_owners }}',
interested_in: '{{ line.print_interested_in }}',
crosses_count: '{{ line.related_crosses_count }}',
area: '{{ line.expressions }}',
},
{% endfor %}
];
</EndUglyCode>
现在正确的方法是根据需要制作一个单独的get请求来获取数据(在角度主页上有大量的角度示例)。
分页绝对是一个好主意,但至少你可以拼接初始结果,这样你就不会一直返回N个对象
lines = Line.objects.filter(deleted=False).order_by('name')[:10]
如果你真的觉得你需要退回所有线路,那么你应该考虑是否需要订购它们,因为这可能构成了大量的时间。