AngularJS анализирует рекурсивный JSON в массив объектов - PullRequest
1 голос
/ 31 октября 2019

У меня были проблемы с AngularJS 1.7 и получением объектов из бэкэнда для целей фильтрации. А именно, я получаю JSON, состоящий из тех же объектов, но некоторые являются потомками других, например:

[
    {
        "id":2,
        "type":"CORP",
        "description":"A-corpus",
        "children": [
            {
                "id":3,
                "type":"FLOOR",
                "description":"1st floor",
                "children":[]} ]
             }
         ]
     }
]

Все эти объекты имеют тип Place. Я не знаю глубины JSON заранее и должен пройти через него рекурсивно, чтобы получить список всех мест. Для этого я создал соответствующий объект с именем place.ts:

export class Place {
  constructor(
    public id: Number,
    public type: String,
    public description: String,
    public children: Array<Place>) {}
}

@Injectable({
  providedIn: 'root'
})
export class placeAdapter implements Adapter<Place> {
  adapt(item: any): Place {
    return new Place(
      item.id,
      item.type,
      item.description,
      item.children
    );
  }
}

, где адаптер является шаблоном проектирования из Использование API-интерфейсов в Angular: Шаблон-адаптер модели , который отлично работает сполучение других предметов из бэкэнда. Кроме того, у меня есть служебный текстовый сценарий с именем place.service.ts:

export class PlaceService {

  constructor(private http: HttpClient, private adapter: placeAdapter) {}

  public query(): Observable<Place[]> {
    return this.http.get('api/places').pipe(
      map((data:any[]) => {
        console.log("place by type:" + data);
        return data.map(item => this.adapter.adapt(item));
      }));
  }

Этот дизайн действительно считывал некоторые вложенные элементы с других конечных точек, но входит в бесконечный цикл, когда я пытаюсь получить эти объекты. Объекты, которые он выводит на консоль несколько раз:

место по типу: [объект Object], [объект Object]

, даже если я дам ему JSON без дочерних элементовмест. IntelliJ показывает мне бесконечные запросы на те же места и их детей. Независимо от того, сколько вложенных элементов есть в JSON, синтаксический анализ выполняется в цикле, и я ничего не могу получить, потому что цикл заставляет все приложение работать слишком медленно.

Как синтаксический анализ таких рекурсивных JSON-ов в массивах объектов выполняется в AngularJS с использованием лучших практик?

1 Ответ

0 голосов
/ 04 ноября 2019

Нашел проблему. Объекты оказались пригодными для использования, и цикл не был ошибкой в ​​коде, который я разместил. Это была ошибка с угловым компонентом ng-multiselect-dropdown , для которого я пытался получить данные (он вызывал метод, который запрашивал список мест). После небольшого исследования выяснилось, что компонент не поддерживает динамический контент, и из-за этого он или сама Angular продолжали повторять GET-запрос.

После некоторых обходных путей компонент теперь принимает динамическое содержимое, и я могу получить доступ к объектам мест просто с помощью кода, который я разместил ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...