角度对象过滤器和orderBy

时间:2016-04-06 16:58:35

标签: angularjs ionic-framework

我从服务器接收对象如下:

Object {
0: "girl night", 
1: "martini", 
2: "burger", 
3: "folk", 
4: "laughter house"
}

使用ng-repeat它可以正常显示但是当我用户过滤或orderBy时,我收到此错误。

<ion-list> <ion-item ng-repeat="item in MyKeyword" ng-click="changeText(item)">{{item}}</ion-item> </ion-list>
  

ionic.bundle.js:25642错误:[filter:notarray]预期的数组但是   收到:{&#34; 0&#34;:&#34;女孩   夜&#34;&#34; 1&#34;:&#34;马提尼&#34;&#34; 2&#34;:&#34;汉堡&#34;&#34; 3&#34 ;: &#34;民间&#34;,&#34; 4&#34;:&#34;笑声家&#34;}

如何使用过滤器正常工作?

4 个答案:

答案 0 :(得分:1)

错误本身明确提到了原因。你不能通过json对象进行迭代。理想情况下,你的反应应该是[&#34;女孩之夜&#34;,&#34;马提尼&#34;,&#34;汉堡&#34;,&#34;民间&#34;,&#34;笑声家& #34;]以此方式工作。

如果您不想更改服务响应格式。然后,像这样迭代。

<ion-list> <ion-item ng-repeat="(key, value) in MyKeyword" ng-click="changeText(value)">{{value}}</ion-item> </ion-list>

答案 1 :(得分:1)

我尝试生成可以模拟您想要实现的快速代码。

<!DOCTYPE html>
<html ng-app>
    <body>

    <div ng-init="data={'0': 'first', '1': 'second', '2': 'third'}">
        <li ng-repeat="item in data">{{item}}</li>
    </div>

    <hr />

    <div ng-init="data=['first', 'second', 'third']">
        <li ng-repeat="item in data">{{item}}</li>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
    </body>
</html>

在我看来你的迭代很好。您可以使用ng-repeat遍历数组或对象。

从您的代码中我无法看到您实际使用过滤器的位置,因此不会真正知道出了什么问题。

然而,提示是javascript数组实际上是对象,具有其他方法和属性,例如:forEachlength。我的假设是你的过滤器,无论它在哪里,无论它做什么,都试图迭代数组。

来自脚本的

在那种情况下 之前你使用它,你可以将你的对象转换为带有这段代码的数组。

var arr = [];
for (var item in object) { 
    arr.push(object[item]); 
}

或者,如果您还想存储索引,则需要对象数组。你可以用这个来实现它:

var arr = [];
for (var item in object) { 
    arr.push({ id: item, value: object[item] }); 
}

使用完阵列后,请对其进行过滤。

来自HTML的

如果您想从HTML级别执行此操作,可以ng-repeat使用key value语法。

<ion-item ng-repeat="(key, value) in MyKeyword">{{value}}</ion-item>

希望它有所帮助。

答案 2 :(得分:0)

您可以将给定的对象转换为数组,然后就可以对其进行ng-repeat。

JS中的

<ion-list> <ion-item ng-repeat="item in convertedToArray" ng-click="changeText(item)">{{item}}</ion-item> </ion-list>
HTML中的

{{1}}

答案 3 :(得分:0)

仅过滤支持数组,但显然您的服务器返回对象。所以你必须将对象转换为数组。

执行此转换的一种简单方法是使用underscore.js。像:

_。values({one:1,two:2,three:3}); =&GT; [1,2,3]

所以情景是这样的 1使您自己的过滤器可能命名为toArray,在过滤器中使用下划线转换为数组并返回。 2使用普通过滤器再次过滤。 3模板看起来像:

ng-repeat =“MyKeyword中的项目| toArray | filter:xxx”