Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 改进性能_Angularjs_Django - Fatal编程技术网

Angularjs 改进性能

Angularjs 改进性能,angularjs,django,Angularjs,Django,我是新来安格拉斯的。我开发了一个列表,在搜索框中键入时可以对其进行过滤。过滤器从数据库对象中获取许多字段,并搜索所有这些字段(例如:名称、id、注释等)。 当我加载所有queryset并使用(push)命令在angular方法中填充列表时,就会出现问题。 由于数据库中有大量记录,加载页面大约需要12秒,而且数据库正在增加,所以这段时间会增加! 我使用时间线测试了性能,正如预期的那样,脚本花费了很长时间 下面是我的一段代码: 模板 <script type="text/javascript"

我是新来安格拉斯的。我开发了一个列表,在搜索框中键入时可以对其进行过滤。过滤器从数据库对象中获取许多字段,并搜索所有这些字段(例如:名称、id、注释等)。 当我加载所有queryset并使用(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>
有什么方法可以提高性能并加快列表的填写速度?
非常感谢。

没有“加速”的办法

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

此外,对于筛选,您需要编写一个api端点,该端点将接受筛选查询并从数据库返回项。然后在表格中显示这些项目。至于何时点击此api,请使用如下组合使用
ngChange
ngModel
ngModelOptions
(用于去盎司):

<input type="text" ng-model="search.query" ng-change="getItems()" ng-model-options="{debounce: 1000}" />


在这里,当用户键入内容并等待1s(由debouce处理)时,将调用
getItems()
。在该函数中,向api发送
search.query

一个快速成功的方法是停止将内容逐个推送到阵列

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

如果你真的觉得你需要返回所有的行,那么你应该考虑是否需要对它们进行排序,因为这可能会占用大量的时间。

你是否考虑过某种分页(即只返回第一个代码> x< /代码>记录)?在数据库端,明显的改进是为用于此类查询的字段添加索引。@jonrsharpe分页不符合网站的要求。这就是为什么我不能用它。过滤过程应该立即检查完整的数据。@Nikita我会立即检查您的建议,谢谢。@Nawwar Mokayes,您可以通过field option从Django方面执行此操作。索引有一个缺点-它们必须进行计算,这需要时间,这取决于数据库的大小—可能很重要,但查询的速度会更快。另外,你可能想看看。谢谢。实际上,分页对于搜索的想法来说是不够的,因为过滤应该立即通过完整的数据。是的,我正在检查你的建议,它似乎起作用了。非常感谢。
$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>
 lines = Line.objects.filter(deleted=False).order_by('name')[:10]