GVKun编程网logo

AngularJS'ng-filter'在〜1000个元素的数组上非常慢

19

此处将为大家介绍关于AngularJS'ng-filter'在〜1000个元素的数组上非常慢的详细内容,此外,我们还将为您介绍关于angularJS$filter、AngularJsfilter过滤器

此处将为大家介绍关于AngularJS'ng-filter'在〜1000个元素的数组上非常慢的详细内容,此外,我们还将为您介绍关于angularJS $filter、AngularJs filter 过滤器、AngularJS Filters、angularjs filter详解的有用信息。

本文目录一览:

AngularJS'ng-filter'在〜1000个元素的数组上非常慢

AngularJS'ng-filter'在〜1000个元素的数组上非常慢

<input>为中的项目名称列表设置了一个简单的搜索过滤器AngularJS

我的清单如下所示:

var uniqueLists = {    category1: [''item1'', ''item2'', ''item3'' ... ''item180'' ], // Real list contains ~180 items    category2: [''itemA'', ''itemB'', ''itemC'' ... ''itemZZZ'' ], // Real list contains ~1080 items    category3: [''otheritem1'', ''otheritem2'', ''otheritem3'' ]  // Real list contains 6 items  }

我在Angular中遍历此列表,并在<ul>每个类别的a中打印出结果。

<div ng-repeat="(key,val) in uniqueLists">    <form ng-model="uniqueLists[index][0]">        <input ng-model="searchFilter" type="text" />            <ul>                <li ng-repeat="value in val | filter: searchFilter">                    <label>                         <input type="checkbox" ng-model="selectedData[key][value]" />                        {{value}}                    </label>                </li>            </ul>    </form></div>

为了清楚起见,selectedData看起来像这样:

var selectedData = {category1: [item1:true], category2: [], category3: []); // if ''item1''s checkbox is checked.

尽管filter即使在我速度相当快的计算机上,该列表也很笨拙,但此列表仍然可以正常工作。在输入中输入字母需要1-2秒才能更新列表。

我知道这很可能是因为我一次过滤了大约1000个项目,但是我在其他地方没有看到对此的任何讨论。

有什么办法可以使过滤器获得更好的性能?

答案1

小编典典

筛选器方法的主要问题在于,每次更改dom都会对其进行操作,因此,筛选器的运行速度不是缓慢,而是后果。一种替代方法是使用类似:

ng-show="([item] | filter:searchFilter).length > 0"

在重复元素上。

通过@OverZealous提供一些代码,您可以使用以下内容比较行为:

  • 过滤器:http://jsbin.com/fuwadanu/1/
  • ng-show:http : //jsbin.com/xajehulo/1/

更新 :Angular v1.2附带了track by语法。这也有助于解决此类问题。如果元素具有一些唯一属性,则可以使用:

ng-repeat="item in items | filter:searchFilter track by item.id"

item.id所有项目中,哪里必须是唯一的。与track by只有那些以DOM元素将被移除这已经不再是在最后的名单,其他人将被 铭记
。而没有track by整个列表的每次都会 重绘 。简而言之:更少的dom操作=更快的重绘。

  • 跟踪者:http : //jsbin.com/dufasego/1/

angularJS $filter

angularJS $filter

过滤:
$filter('filter')(datalist,keyword);

排序:
$filter('orderBy')(datalist,key);//key为dataList实例中的一个字段

AngularJs filter 过滤器

AngularJs filter 过滤器

AngularJs filter 过滤器

Filter

Ng里的过滤器。

currency:把一个数字格式化成货币模式(如$1,234.56)。当没有提供任何货币符号时,默认使用当前区域的符号。

使用:

HTML:{{ currency_expression | currency:symbol:fractionSize}}

JS:$filter(“currency”)(amount,symbol,fractionSize);

amount:数值,过滤的值。

symbol:字符串,要显示的货币符号或标识符。

fractionSize:数值,整数的小数位数,默认为当前的最大位数。

date:基于需要的格式将时间格式化成字符串。

使用:

HTML:{{date_expression | date:format:timezone}}

JS:$filter(“date”)(date,format,timezone);

date:格式化为日期的日期对象。如果没有指定输入的时区字符串,时间则是当地时间。

format:格式规则/格式。

timezone:时区。

filter:从数组中选出一个子集,并将其作为一个新数组返回。

使用:

HTML:{{filter_expression | filter:expression:comparator}}

JS:$filter(“filter”)(array,expression,comparator);

array:被过滤的数组。

expression:字符串/对象/函数,用于从数组中选择数据的判断表达式。使用$可以匹配任何字段。

comparator:函数/Boolean/undefined,用于确定预期的值(从filter表达式返回)和实际的值(数组中的对象)进行比较,应视为匹配。function(actual,expected);

json:允许将一个javascript对象转换为json字符串。

使用:

HTML:{{json_expression | json:spacing}}

JS:$filter(“json”)(object,spacing);

object:过滤的对象。

spacing:每个缩进的空格数,默认为2。

limitTo:创建一个只包含指定数目元素的数组或字符串。元素是按指定的值和符号(+或-)从数组、字符串或数字的开头或结尾获取的。如果输入一个数字,则转换为字符串。

使用:

HTML:{{limitTo_expression | limitTo:limit:begin}}

JS:$filter(“limitTo”)(input,limit,begin);

input:限制的数组,字符串,数字。

limit:限制的长度。

begin:限制长度开始的位置(根据索引)。

lowercase:将字符串转换为小写。

使用:

HTML:{{lowercase_expression | lowercase}}

JS:$filter(“lowercase”)(input);

Input:过滤的字符串。

number:将数值转换为文本。

如果输入是null或undefined,那么其将被返回。如果输入的是无穷(正无穷/负无穷),将会返回无穷大的符号“∞”。如果输入不是一个数字,返回一个空字符串。

使用:

HTML:{{number_expression | number:fractionSize}}

JS:$filter(“number”)(number,fractionSize);

number:转换的数值。

fractionSize:数值,整数的小数位数,默认为当前的最大位数。在默认的区域设置的情况下这个数值是3。

orderBy:通过判断表达式将指定的数组进行排序。它是按字符串的字母顺序和数值的数字排序的。

注意:如果你发现数字没有按预期排序,请确保它们实际上是被保存为数字而不是字符串。

使用:

HTML:{{orderBy_expression | orderBy:expression:reverse}}

JS:$filter(“orderBy”)(array,reverse);

array:排序的数组。

expression:字符串/函数/数组,用来确定元素顺序的表达式。

reverse:boolean,颠倒数组的顺序。默认为false。

uppercase:将字符串转换为大写。

使用:

HTML:{{uppercase_expression |uppercase}}

JS:$filter(“uppercase”)(input);

Input:过滤的字符串。

自带filter使用代码:

  <div ng-app="Demo" ng-controller="testCtrl as ctrl">
     <!-- HTML: {{ctrl.currencyValue | currency:"USD$":1}} -->
     {{ctrl.currencyValue}}
      HTML: {{ctrl.dateValue | date:"yyyy-MM-dd"}} -->
     {{ctrl.dateValue}}
      HTML: <div ng-repeat="i in newArr = (ctrl.arr | filter:'2')">{{i}}</div> -->
     ng-repeat="i in ctrl.newArr">{{i}}</div HTML: <div ng-repeat="i in newArr = (ctrl.arr | filter:{check:true})">{{i}}</div> ="i in ctrl._newArr">
     {{ctrl.obj | json}}
      HTML: <div ng-repeat="i in ctrl.arr | limitTo:3:2">{{i}}</div> ="i in ctrl.secondNewArr" HTML: {{ctrl.str | lowercase}} -->
     {{ctrl.str}}
      HTML: <div ng-repeat="i in ctrl.arr | orderBy:'name':true">{{i}}</div> ="i in ctrl.thirdNewArr" HTML: {{ctrl.str | uppercase}} -->
     {{ctrl.newStr}}
  >
(function () {
    angular.module("Demo",[])
    .controller("testCtrl",["$filter",testCtrl]);
    function testCtrl($filter) {
        this.currencyValue = 1234.56;
        this.currencyValue = $filter("currency")(this.currencyValue,"USD$",1);
        this.dateValue = new Date();
        this.dateValue = $filter("date")(this.dateValue,"yyyy-MM-dd");
        this.arr = [{name:'John',phone:'555-1276',check:true},        {name:'Mary',phone:'800-BIG-MARY',255); line-height:1.5!important">false},        {name:'Mike',phone:'555-4321',        {name:'Adam',phone:'555-5678',        {name:'Julie',phone:'555-8765',        {name:'Juliette',255); line-height:1.5!important">true}];
        this.newArr = $filter("filter")(this.arr,"2");
        this._newArr = $filter("filter")(true});
        this.obj = {"name":"beast","age":21};
        this.secondNewArr = $filter("limitTo")();
        this.str = "Hello World";
        this.str = $filter("lowercase")(this.str);
        this.thirdNewArr = $filter("orderBy")(true);
        this.newStr = $filter("uppercase")(this.str);
    };
  }());

自定义filter

基本代码:

  angular.module(“x”,[]).filter(“filterName”,[“dependancy”,255); line-height:1.5!important">function(dependancy){
       return function(value){
         //your code   return the data which passed filter(返回过滤后的数据)
  };
  }]);

filterName:过滤器名称。

dependency:注入的服务。

value:需要过滤的数据。

自定义filter使用代码:

  >
    ="i in newArr=(ctrl.arr | myFilter)">
       {{i.value}}
    >
  >
  (,myFilter)
    .controller("testCtrl",255); line-height:1.5!important">function myFilter(){
       function(value){
          var arr = [];
          angular.forEach(value,function(item,index){
              if(item.value.indexOf("this")>=0){
                  arr.push(item);
              }
          });
          return arr;
      }
    };
    this.arr = [{"value":"this is a."},{"value":"that is b."},{"value":"this is c."},{"value":"that is a."}];
    };
  }());

这里对数组arr进行过滤,把数组中对象value属性的值含有”this“文本的对象都放进个新数组并返回该数组。

关于自定义filter中为什么执行两次的问题请参考:Stack Overflow

AngularJS Filters

AngularJS Filters

过滤器可以使用一个管道字符(|)添加到表达式和指令中。

AngularJS 过滤器

AngularJS 过滤器可用于转换数据:

过滤器 描述
currency 格式化数字为货币格式。
filter 从数组项中选择一个子集。
lowercase 格式化字符串为小写。
orderBy 根据某个表达式排列数组。
uppercase 格式化字符串为大写。

 

表达式中添加过滤器

过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中。.

((下面的两个实例,我们将使用前面章节中提到的 person 控制器))

uppercase 过滤器将字符串格式化为大写:

<div ng-app="myApp" ng-controller="personCtrl">

p>姓名为 {{ fullName() | uppercase }}</div>
script type="text/javascript" src="js/angular.min.js"></script="text/javascript">
    angular.module('myApp,[]).controller(personCtrlfunction($scope) {
    $scope.firstName = "Johncope.lastName Doecope.fullName () {
        return $scope.firstName + " + $scope.lastName;
    }
});
>

结果为:姓名为 JOHN DOE

lowercase 过滤器将字符串格式化为小写:

>姓名为 {{ lastName | lowercase }}姓名为 john doe

currency 过滤器

currency 过滤器将数字格式化为货币格式:

="costCtrl">

数量: input ="number" ng-model="quantity"
价格: ="price">总价 = {{ (quantity * price) | currency }}>
var app = angular.module(costCtrl($scope) {
    $scope.quantity 1;
    $scope.price 9.99;
});
>

结果如图所示:

向指令添加过滤器

过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中。

orderBy 过滤器根据表达式排列数组:

="namesCtrl">循环对象:ul>
  li ng-repeat="x in names | orderBy:'country'"
    {{ x.name + ',' + x.country }}
  linamesCtrl($scope) {
    $scope.names  [
        {name:Janinorway},{name:HegeSwedenKaiDenmark}
    ];
});
>

结果:

循环对象:

  • Kai,Denmark
  • Jani,norway
  • Hege,Sweden

过滤输入

>输入过滤:><="text"="test"="x in names | filter:test | orderBy:'country'"
    {{ (x.name | uppercase) + ',1)">>

结果如图所示:当输入k时,会过滤掉其他的。

 转载地址:http://www.runoob.com/angularjs/angularjs-filters.html

总结

以上是小编为你收集整理的AngularJS Filters全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

angularjs filter详解

angularjs filter详解

过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。

主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等。

ng内置了一些过滤器,它们是:currency(货币)、date(日期)、filter(子串匹配)、json(格式化json对象)、limitTo(限制个数)、lowercase(小写)、uppercase(大写)、number(数字)、orderBy(排序)。总共九种。

除此之外还可以自定义过滤器,这个就强大了,可以满足任何要求的数据处理。

过滤器的内容非常简单,只要明白了内置的如何使用,自己如何定义一个filter就OK了

 

一、filter的两种使用方法

1. 在模板中使用filter

我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下:

{{ expression | filter }}

也可以多个filter连用,上一个filter的输出将作为下一个filter的输入(怪不得这货长的跟管道一个样。。)

{{ expression | filter1 | filter2 | ... }}

filter可以接收参数,参数用 : 进行分割,如下:

{{ expression | filter:argument1:argument2:... }}

除了对{{}}中的数据进行格式化,我们还可以在指令中使用filter,例如先对数组array进行过滤处理,然后再循环输出:

<span ng-repeat="a in array | filter ">

2. 在controller和service中使用filter

我们的js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入,例如我要在controller中使用currency过滤器,只需将它注入到该controller中即可,代码如下:

app.controller(''testC'',function($scope,currencyFilter){
    $scope.num = currencyFilter(123534);  
}

在模板中使用{{num}}就可以直接输出$123,534.00了!在服务中使用filter也是同样的道理。

此时你可能会有疑惑,如果我要在controller中使用多个filter,难道要一个一个注入吗,这岂不太费劲了?小兄弟莫着急~ng提供了一个$filter服务可以来调用所需的filter,你只需注入一个$filter就够了,使用方法如下:

app.controller(''testC'',function($scope,$filter){
    $scope.num = $filter(''currency'')(123534);
  $scope.date = $filter(''date'')(new Date()); }

可以达到同样的效果。好处是你可以方便使用不同的filter了。

 

二、ng的内置过滤器

ng内置了九种过滤器,使用方法都非常简单,看文档即懂。不过为了以后不去翻它的文档,我在这里还是做一个详细的记录。

  1. currency (货币处理)

  使用currency可以将数字格式化为货币,默认是美元符号,你可以自己传入所需的符号,例如我传入人民币:

{{num | currency : ''¥''}}

  2. date (日期格式化)

  原生的js对日期的格式化能力有限,ng提供的date过滤器基本可以满足一般的格式化要求。用法如下:

{{date | date : ''yyyy-MM-dd hh:mm:ss EEEE''}}

  参数用来指定所要的格式,y M d h m s E 分别表示 年 月 日 时 分 秒 星期,你可以自由组合它们。也可以使用不同的个数来限制格式化的位数。另外参数也可以使用特定的描述性字符串,例如“shortTime”将会把时间格式为12:05 pm这样的。ng提供了八种描述性的字符串,个人觉得这些有点多余,我完全可以根据自己的意愿组合出想要的格式,不愿意去记这么多单词~

  3. filter(匹配子串)

  这个名叫filter的filter(不得不说这名字起的,真让人容易混淆——!)用来处理一个数组,然后可以过滤出含有某个子串的元素,作为一个子数组来返回。可以是字符串数组,也可以是对象数组。如果是对象数组,可以匹配属性的值。它接收一个参数,用来定义子串的匹配规则。下面举个例子说明一下参数的用法,我用现在特别火的几个孩子定义了一个数组:

复制代码
$scope.childrenArray = [
        {name:''kimi'',age:3},
        {name:''cindy'',age:4},
        {name:''anglar'',age:4},
        {name:''shitou'',age:6},
        {name:''tiantian'',age:5}
    ];
$scope.func = function(e){return e.age>4;}
复制代码
{{ childrenArray | filter : ''a'' }} //匹配属性值中含有a的
{{ childrenArray | filter : 4 }}  //匹配属性值中含有4的
{{ childrenArray | filter : {name : ''i''} }} //参数是对象,匹配name属性中含有i的
{{childrenArray | filter : func }}  //参数是函数,指定返回age>4的

  4. json(格式化json对象)

  json过滤器可以把一个js对象格式化为json字符串,没有参数。这东西有什么用呢,我一般也不会在页面上输出一个json串啊,官网说它可以用来进行调试,嗯,是个不错的选择。或者,也可以用在js中使用,作用就和我们熟悉的JSON.stringify()一样。用法超级简单:

{{ jsonTest | json}}

  5. limitTo(限制数组长度或字符串长度)

  limitTo过滤器用来截取数组或字符串,接收一个参数用来指定截取的长度,如果参数是负值,则从数组尾部开始截取。个人觉得这个filter有点鸡肋,首先只能从数组或字符串的开头/尾部进行截取,其次,js原生的函数就可以代替它了,看看怎么用吧:

{{ childrenArray | limitTo : 2 }}  //将会显示数组中的前两项

  6. lowercase(小写)

  把数据转化为全部小写。太简单了,不多解释。同样是很鸡肋的一个filter,没有参数,只能把整个字符串变为小写,不能指定字母。

{{ "SUN" | lowercase}}

  7. uppercase(大写)

{{ "sun" | uppercase}}

 8. number(格式化数字)

  number过滤器可以为一个数字加上千位分割,像这样,1.234567。同时接收一个参数,可以指定float类型保留几位小数:

{{ num | number : 2 }}

    9. orderBy(排序)

  orderBy过滤器可以将一个数组中的元素进行排序,接收一个参数来指定排序规则,参数可以是一个字符串,表示以该属性名称进行排序。可以是一个函数,定义排序属性。还可以是一个数组,表示依次按数组中的属性值进行排序(若按第一项比较的值相等,再按第二项比较),还是拿上面的孩子数组举例:

<div>{{ childrenArray | orderBy : ''age'' }}</div>      //按age属性值进行排序
<div>{{ childrenArray | orderBy : ''age'':true }}</div>  //设置第二个参数true之后,可以按age属性值进行倒序排序
<div>{{ childrenArray | orderBy : orderFunc }}</div>   //按照函数的返回值进行排序
<div>{{ childrenArray | orderBy : [''age'',''name''] }}</div> //如果age相同,按照name进行排序

  内置的过滤器介绍完了,正如你所看到的,ng内置的过滤器也并不是万能的,事实上好多都比较鸡肋。更个性化的需求就需要我们来定义自己的过滤器了,下面来看看如何自定义过滤器。

 

三、自定义过滤器

filter的自定义方式也很简单,使用module的filter方法,返回一个函数,该函数接收输入值,并返回处理后的结果。话不多说,我们来写一个看看。

比如我需要一个过滤器,它可以返回一个数组中下标为奇数的元素,代码如下:

复制代码
app.filter(''odditems'',function(){
    return function(inputArray){
        var array = [];
        for(var i=0;i<inputArray.length;i++){
            if(i%2!==0){
                array.push(inputArray[i]);
            }
        }
        return array;
    }
});

{{"[1,2,3,4]"|odditems}}
复制代码

 格式就是这样,你的处理逻辑就写在内部的那个闭包函数中。你也可以让自己的过滤器接收参数,参数就定义在return的那个函数中,作为第二个参数,或者更多个参数也可以。

 

关于AngularJS'ng-filter'在〜1000个元素的数组上非常慢的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于angularJS $filter、AngularJs filter 过滤器、AngularJS Filters、angularjs filter详解的相关信息,请在本站寻找。

本文标签: