Ошибка: [filter: notarray] Ожидаемый массив, но получен

#angularjs #angularjs-ng-repeat #angular-filters

#angularjs #angularjs-ng-repeat #angular-фильтры

Вопрос:

Я знаю, что на этот вопрос был дан ответ ранее, но ни одно из этих решений не работает для меня. Может ли кто-нибудь, пожалуйста, помочь мне с приведенной ниже ошибкой?

Я получаю ошибку при использовании 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) amp;amp; !angular.isArray(expected)) || (angular.isObject(actual) amp;amp; !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:

Я предполагаю, что вы показываете только подмножество json в своем сообщении?

Ваше Service свойство в вашем json является объектом, а не массивом. Для перебора свойств объекта вам нужно будет использовать другую форму ng-repeat , которая:

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

Вы также захотите обновить свой filterWithOr фильтр, чтобы отразить эти изменения, поскольку вы не имеете дело с массивами.

Следует отметить пару моментов в соответствии с документами ng-repeat Angular с использованием (key, value)

Спецификация JavaScript не определяет порядок ключей, возвращаемых для объекта, поэтому Angular полагается на порядок, возвращаемый браузером при запуске для ключа в myObj. Браузеры обычно следуют стратегии предоставления ключей в том порядке, в котором они были определены, хотя бывают исключения, когда ключи удаляются и восстанавливаются. Смотрите страницу MDN при удалении для получения дополнительной информации.

ngRepeat будет молча игнорировать ключи объекта, начинающиеся с $, потому что это префикс, используемый Angular для общедоступных ($) и приватных ($$) свойств.

Встроенные фильтры OrderBy и filter не работают с объектами и выдадут ошибку при использовании с одним из них.

Комментарии:

1. Если Я согласен с ответом, но есть ли какое-либо решение, в котором я могу использовать контроллер, который поможет мне использовать ng-repeat как для JSONObject, так и для JSONArray, поскольку мои данные JSON иногда поступают как массив, а иногда как объект