【问题标题】:Error: [filter:notarray] Expected array but received错误:[filter:notarray] 预期的数组但已收到
【发布时间】:2016-10-23 01:27:27
【问题描述】:

我知道之前已经回答了这个问题,但这些解决方案都不适合我。有人可以帮我解决以下错误吗?

当我没有得到数组时,我在使用 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);
    };
});

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    根据ng-repeat Angular docs 使用(key, value) 需要注意的几件事

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

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

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

    【讨论】:

    • F 我同意答案,但是有什么解决方案可以让我控制这将帮助我对 JSONObject 和 JSONArray 使用 ng-repeat,因为我的 JSON 数据有时以数组形式出现,有时以对象形式出现跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2017-12-29
    • 2011-07-11
    • 2016-12-16
    • 2018-02-25
    • 2017-06-15
    • 2013-04-05
    相关资源
    最近更新 更多