javascript - 在 oi-select 中加载大数组在 angularjs 中花费太多时间

标签 javascript angularjs angularjs-directive angularjs-ng-repeat

我正在使用 oi-select 库,我已经根据我的项目需要对其进行了自定义,并且我已经为它编写了指令。问题是加载大约 3k 数组数据需要花费太多时间,比如 10 秒。我想尽量减少它的时间。我在这里创建了 plunker 为此。

我有加载所有工厂数据并将其提供给 oi-select 的指令,在我的代码中这里是 html

<small><b>select {{MPhardwaresListDropDown.length}}</b></small>
                        <div style="padding-top: 7px">
                            <div title="" class="selected-multiple-items">
                                    {{MPselectedHardwares.length}} selected
                            </div>
                            <grid-multi-select id="hardwareId" clean="clean" optionlist="MPhardwaresListDropDown" colval="name"></grid-multi-select>
                        </div>

指令中的 HTML 代码如下所示

<div>
        <div ng-repeat="optionVal in tempOptionList | orderBy : ['-originalcheck','+label']" prevent-close>
            <div ng-if="optionVal.label">
                <label class="checkbox" ng-if="!typeFilterOptions || (optionVal.label.toString().toLowerCase().indexOf(typeFilterOptions.toLowerCase()) > -1)">
                    <input type="checkbox" name="checkbox1" ng-checked="optionVal.check" ng-model="optionVal.check"/>

                    <span class="checkbox__input"></span>
                    <span class="checkbox__label" style="color:#A9A9A9;">{{optionVal.label}}</span>
                </label>
            </div>
            <div ng-if="!optionVal.label">
                <label class="checkbox" ng-if="!typeFilterOptions || (optionVal.val.toString().toLowerCase().indexOf(typeFilterOptions.toLowerCase()) > -1)">
                    <input type="checkbox" name="checkbox1" ng-checked="optionVal.check" ng-model="optionVal.check" ng-change="checking(typeFilterOptions)"/>

                    <span class="checkbox__input"></span>
                    <span class="checkbox__label" style="color:#A9A9A9;">{{optionVal.val}}</span>
                </label>
            </div>



        </div>

angular code is too big to mention in this question please refer plunker, but this is how it loops

scope.selection = scope.selectionorg;
                scope.checkedall=scope.checkedallorg;
                scope.OptionList=parentScope[scope.parentListName].sort();
                scope.tempOptionList=[];
                var i=0;
                for(i=0;i<scope.OptionList.length;i++) {
                    scope.tempOptionList[i] = {val: scope.OptionList[i], check: false, originalcheck: false};
                }
                if(scope.optionListSelectedList.length>0) {
                    angular.forEach(scope.optionListSelectedList, function(obj){
                        angular.forEach(scope.tempOptionList, function(obj1){
                            if(obj===obj1.val){
                                obj1.check=true;
                                obj1.originalcheck=true;
                            }
                        });
                    });
                }
                else{
                    scope.checkedall=false;
                }
            };

我想要类似的东西,它会在滚动时加载部分数据,它会加载更多数据,我们将不胜感激。非常感谢。

编辑 现在我在 ng-repeat 中使用 limitTo 编辑了我的 plunker,为此我编写了新指令,当滚动到达底部时将触发 addmoreitems 函数。 updatedPlunker

现在的问题是,当我输入和搜索某些内容时,它只在与 limitTo 相关的可用记录中搜索它不在所有数据中搜索,比如现在 limitTo 是 50,那么搜索只在 50 条记录中发生,而不是在 3k 中记录。

最佳答案

完成这种要求的正确方法是使用分页,因为您是从服务器端加载数据,所以您应该让您的 api 支持分页。

它应该接受三个参数,例如 number of items, start, limit 并且您应该首先获取项目的数量并重复它直到获得整个结果集。

应该有另一个请求来获取项目的总数。通过这样做,您可以一次检索在客户端加载的所有元素。在此之前,您应该有一个加载指示器,或者您可以在登录过程/应用程序启动时加载此数据。

limitTo 将无法帮助搜索,因为您限制了结果。

关于javascript - 在 oi-select 中加载大数组在 angularjs 中花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355599/

相关文章:

javascript - 吊装不起作用?

html - AngularJS 菜单布局桌面和移动响应

angularjs - 在AngularJS指令中获得第一个 child

angularjs - ui.bootstrap-directive 与 uib-popover-html 不起作用

javascript - 在 AngularJs 中获取文本区域光标位置

javascript - 我在使用 Angular 指令复制最简单的 JavaScript 代码时遇到问题

javascript - Onclick 函数一键触发两次

javascript - div 的 id 属性未定义/未在 React 应用程序中捕获 onClick

javascript - 通过用户输入将对象添加到数组

AngularJs - 为什么 $emit 在我的弹出窗口中不起作用