错误:[filter:notarray]预期的数组但收到了

时间:2016-10-22 08:32:45

标签: angularjs angularjs-ng-repeat angular-filters

我知道此前已经回答过,但这些解决方案都不适用于我。有人可以帮我解决下面的错误吗?

当我没有获得数组时,使用 Ng-Repeat 自定义过滤器时出现错误。

任何人都可以帮助我使用控制器来使用ng-repeat来处理JSONObject和JSONArray

HTML代码

<td class="features" ng-show="list.Body.WorkOrder.OrderStatus.length > 0">
<span ng-repeat="indi in list.Body.Services.ServiceChanges.ServiceDisconnects.Service | filterWithOr:{_serviceID:['SS001','ST099','SS018']} ">{{indi._serviceID}},{{indi.EPCServiceDef.EPCProduct._pn}}<br></span>
</td>

如果我有ServiceDisconnects部分,则会产生错误,如下所示

 "ServiceDisconnects": {
  "Service": {
    "-serviceID": "ST099",
    "ServiceChangeActivity": "Disconnect",
    "TelephoneNumbers": {
      "TN": "                    "
    },
    "Rate": "0.00",
    "Desc": "Xhnoecosvr",
    "Count": "0",
    "LOB": "Other",
    "PackageCode": "ST099   ",
    "EPCServiceDef": {
      "EPCProduct": {
        "-pn": "10400138",
        "Name": "EcoSaver Opt-Out Tracking",
        "LongDescription": "NO ECOSAVER TRACKING",
        "Type": "Feature",
        "LOB": "Video"
      }
    },
    "CSGServiceIdentifier": "5"
  }
}

但是当ServiceDisconnects部分有多个服务数组时,同样的事情也会起作用。

这是自定义过滤器

app.filter('filterWithOr', function($filter) {
    var comparator = function(actual, expected) {
        if (angular.isUndefined(actual)) {
            // No substring matching against `undefined`
            return false;
        }
        if ((actual === null) || (expected === null)) {
            // No substring matching against `null`; only match against `null`
            return actual === expected;
        }
        if ((angular.isObject(expected) && !angular.isArray(expected)) || (angular.isObject(actual) && !hasCustomToString(actual))) {
            // Should not compare primitives against objects, unless they have custom `toString` method
            return false;
        }

        actual = angular.lowercase('' + actual);
        if (angular.isArray(expected)) {
            var match = false;
            expected.forEach(function(e) {
                e = angular.lowercase('' + e);
                if (actual.indexOf(e) !== -1) {
                    match = true;
                }
            });
            return match;
        } else {
            expected = angular.lowercase('' + expected);
            return actual.indexOf(expected) !== -1;
        }
    };
    return function(campaigns, filters) {
        return $filter('filter')(campaigns, filters, comparator);
    };
});

1 个答案:

答案 0 :(得分:1)

我假设您只在帖子中显示json的子集?

您的json中的Service属性是一个对象,而不是一个数组。要迭代对象属性,您需要使用ng-repeat的另一种形式:

<div ng-repeat="(key, value) in myObj"></div>

您还需要更新filterWithOr过滤器以反映这些更改,因为您没有处理数组。

根据使用(key, value)

ng-repeat Angular docs注意事项
  

JavaScript规范没有定义键的顺序   返回一个对象,因此Angular依赖于返回的顺序   在myObj中运行key时的浏览器。浏览器通常遵循   按照定义顺序提供密钥的策略,   虽然删除和恢复密钥时会有例外情况。   有关详细信息,请参阅删除的MDN页面。

     

ngRepeat会默默地忽略以$开头的对象键,因为   它是Angular用于公共($)和私有($$)的前缀   属性。

     

内置过滤器orderBy和filter不适用于对象,和   如果与一个一起使用将抛出错误。