Ионное дерево каталогов 5 динамически

#ionic-framework

Вопрос:

Я создал простой браузер файлов JavaScript, который отображает содержимое каждого каталога, загружая содержимое подкаталога из бэкэнда с помощью AJAX-запроса при нажатии на имя каталога. О загрузке полного дерева не может быть и речи. Содержимое каталога отправляется в формате JSON. Каталог чем-то похож на приведенный ниже и не может быть загружен рекурсивно целиком из-за количества каталогов и файлов. (Воображаемая) структура каталогов проста, но она может иметь несколько вложенных уровней:

 docs
    assemblies
       2019-07
           doc-6811.txt
           instructions-6811.pdf
        2019-08
           doc-7012.txt
           instructions-7012.pdf
    ...
    invoices
       2019-07
           invoice-6811.pdf
       2019-0
           invoice-7012.pdf
    tickets
        2019-07
            ticket-98141.txt
 

Элементы для каждого каталога находятся в массиве объектов JS:

 [{
   name: '2019-07',
   isDirectory: true,
   fullPath: "/mnt/samba/docs/assemblies/2019-07"       
},
{
   name: '2019-08',
   isDirectory: true,
   fullPath: "/mnt/samba/docs/assemblies/2019-08"
} ...
]  
 

Конечно, есть и файлы, но они не являются проблемой. Теперь мне нужно сделать то же самое в Ionic, но я полностью потерялся с отправной точкой. Верхний каталог хорошо отображается, и текущий простой шаблон (я называю его шаблоном) выглядит примерно так:

 <ion-content>
    <ion-list>
        <ion-item-sliding *ngFor="let d of directories">
        <ion-item (click)="openFolder(d)">  <!-- just an example call --->
            <ion-icon name="folder"      slot="start" *ngIf="d.isdirectory"></ion-icon>
            <ion-icon name="triangle"    slot="start" *ngIf="!d.isdirectory"></ion-icon>
            <ion-label text-wrap>
            {{ d.name }}
            <p>{{ d.fullPath }}</p>
            </ion-label>
            
            <!-- THIS is where the directory contents should appear using 
                the same structure as this template -->
            
        </ion-item>

        </ion-item-sliding>
    </ion-list>
</ion-content>
 

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

Извлечение каталогов-простая задача, и я получаю массив просто отлично. Однако мне пока не удалось выполнить какой-либо рендеринг. Любые альтернативы и/или указатели приветствуются.

Ответ №1:

Ваш JSON должен быть рекурсивным JSON. Под этим я подразумеваю,

 { "items": [
    {
      "name": "ABC1",
      "isDirectory": true,
      "fullPath": "/mnt/samba/docs/assemblies/2019-07",
      "children":[
        {
          "name": "ABC11",
          "isDirectory": true,
          "fullPath": "/mnt/samba/docs/assemblies/2019-08"
        }, 
        {
          "name": "ABC12",
          "isDirectory": true,
          "fullPath": "/mnt/samba/docs/assemblies/2019-08"
        }
      ]  
    },
    {
      "name": "ABC2",
      "isDirectory": true,
      "fullPath": "/mnt/samba/docs/assemblies/2019-08"
    }
  ] 
}
 

Если это возможно, вы можете сделать то же самое, используя рекурсивный ng-шаблон
Пример того же самого приведен по этой ссылке.

Нажмите здесь, чтобы просмотреть ссылку.

Немного Google по рекурсивному ng-шаблону также может помочь. 🙂

Я искренне надеюсь, что это поможет.

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

1. Джей, пожалуйста, перечитай мой вопрос. Мне нужно загрузить содержимое подкаталога ПО ЗАПРОСУ. О загрузке полного дерева абсолютно не может быть и речи из-за количества каталогов и файлов. Для запуска приложения потребуется небольшая вечность, а для запуска потребуется огромный объем памяти.

2. Вы абсолютно легко можете это сделать. Каждый раз, когда вы нажимаете на узел, чтобы открыть его, вы можете (HTTP) запросить его дочерние узлы и установить его в качестве дочернего объекта. ng-шаблон автоматически обновит пользовательский интерфейс.

3. Джей, «легко» может быть правдой, но я еще нигде не видел ни одного примера Angular. Я делал это десятки раз в pure JS, но никогда в pure Angular. Отсюда и вопрос.