2016-03-07 136 views
2

我是AngularJS中的新成员。我开发了一个列表,可以在搜索框中输入时进行过滤。过滤器会从数据库对象中获取许多字段并搜索所有这些字段(如:name,id,comments ...等)。 当我加载所有queryset并使用(push)命令在角度方法中填充列表时,会出现此问题。 因为我在数据库中有大量的记录,加载该页面需要大约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)) 

以提高性能,加快填补名单什么办法? 非常感谢。

+1

你有没有考虑过某种分页方式(即只返回第一个'x'记录)? – jonrsharpe

+0

在数据库端,显而易见的改进是为用于此类查询的字段添加索引。 – Nikita

+0

@jonrsharpe 分页不符合网站的要求。这就是为什么我不能使用它。 过滤过程应该一次完成整个数据。 –

回答

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] 

如果你真的觉得你需要可以拼接的初步结果返回所有行,那么你应该考虑是否需要订购它们,因为这可能会占用很大一部分时间。

+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秒(getItems()将被调用debouce)。在该功能中,将search.query发送到api。

+0

谢谢。 实际上,分页对于搜索的想法是不够的,因为过滤应该一次完成整个数据。 –