提高绩效

时间:2016-03-07 15:41:05

标签: angularjs django

我是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))

有什么方法可以提高性能并加快填写清单的速度? 非常感谢你。

2 个答案:

答案 0 :(得分:2)

没有办法'加速'。

最好的方法是对表进行分页,以便最初只为第一页加载数据。比如,你有1000个项目,将它分成每个100个项目的页面。因此,最初只会提取前100个项目。当你转到另一个页面接下来的100个项目等等。

此外,对于过滤,您将编写一个api端点,该端点将接受过滤器查询并从数据库返回项目。然后在表格中显示这些项目。至于何时点击此API,请使用ngChangengModelngModelOptions(用于去抖动)的组合,如下所示:

<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]

如果你真的觉得你需要退回所有线路,那么你应该考虑是否需要订购它们,因为这可能构成了大量的时间。