#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 иногда поступают как массив, а иногда как объект