【问题标题】:ngRepeat treats an array-like object as an object not an arrayngRepeat 将类似数组的对象视为对象而不是数组
【发布时间】:2015-03-12 17:03:40
【问题描述】:

我有一个叫做 NoDupesArray 的东西。我用它来创建一个不允许重复项的数组。以编程方式,它是一个扩展 Array 原型的对象,如下所示(我们不要争论 Object.create 与 this):

function NoDupesArray(){}
NoDupesArray.prototype = Array.prototype
NoDupesArray.prototype.push = function(){
    //...blahblahblha
}

不幸的是,当我在 Angular 的 ng-repeat 中使用这个数组时,我无法使用 Angular 的内置过滤器功能。这不起作用:

<li class="row" ng-repeat="task in tasks | filter:{completed_at:'!null'}"></li>

我认为这是因为 Angular 将“任务”视为对象而不是数组。有没有办法强制 angular 将我的自定义数组识别为数组,以便我可以使用过滤器?谢谢!

【问题讨论】:

    标签: javascript arrays angularjs object ng-repeat


    【解决方案1】:

    所以现在我使用的解决方案是:

    <li class="row" ng-repeat="task in tasks.slice() | filter:{completed_at:'!null'}"></li>
    

    这会将 NoDupesArray 变回一个普通的旧数组,但我认为必须有更好的方法来做到这一点。

    【讨论】:

      【解决方案2】:

      如果任务是一个对象,你仍然可以使用 ng-repeat。您应该为对象中的值和键提供两个变量,如下所示:

      <li class="row" ng-repeat="(key, task) in tasks | filter:{completed_at:'!null'}"></li>
      

      【讨论】:

      • 不幸的是,该代码不起作用。看起来 filterFilter 只是返回未过滤的数组,如果它认为它不是一个数组,即使它是。朋友帮我找到了这个:stackoverflow.com/questions/13887504/…
      【解决方案3】:

      保持Array.push()原有的功能

      NoDupesArray.prototype.push = function (){
        return function() {
          var uniqueArguments = getItemsNotInArray(this, arguments);
          return Array.prototype.push.apply(this, uniqueArguments);
        };
      };
      

      【讨论】:

      • 是的,这就是函数的主体。问题似乎是 angular 不使用 instanceof 来检查 NoDupesArray 是数组还是对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2019-04-14
      • 2011-03-10
      • 2017-02-24
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多