Как гармонировать с * ngFor в угловых 8 - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать динамическую иерархию аккордеона, используя * ngFor и bootstrap accordion.

Вот мой код ...

<div class="container" style="color:black;">
    <div id="accordion">
        <div class="card">
            <div class="card-header" id="headingOne">
                <h5 class="mb-0 d-inline">
                    <button type="button" class="btn btn-link" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                        Available Namespaces
                    </button>
                </h5>
                <a href="#" data-target="[data-parent='#child1']" data-toggle="collapse" class="my-2 float-right">toggle all</a>
            </div>
            <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
                <div class="card-body" id="child1">
                    <div class="card" *ngFor="let name of namespaces">
                        <div class="card-header">
                            <a href="#" data-toggle="collapse" data-target="#collapseOneA">{{name}}</a>
                        </div>
                        <div class="card-body collapse" data-parent="#child1" id="collapseOneA">
                            {{name}}
                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>
</div>

пространства имен в ngFor получают свое значениеиспользуя вызов API остальных. Я проверил там строковый массив с двумя значениями в нем.

public namespaces: string[] = [];

ngOnInit() {
    const credentials = environment.ouathClientId + ':' + environment.oauthClientSecret;
            this.httpclient
                .get<string[]>(this.namespaceApi, {
                    headers: new HttpHeaders({
                        'Content-Type': 'application/json;charset=utf-8',
                        Authorization: 'Basic ' + btoa(credentials)
                    })
                })
                .subscribe(
                    (data) => {
                        this.namespaces = data;
                    },
                    (error) => {

                        alert(error.error.message);
                    }
                );
}

, но все равно значения не отображаются в аккордеоне. Любое предложение ...

Ответы [ 3 ]

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

Я считаю, что вам нужно поместить * ngFor выше в элементах, чтобы он отображался правильно. Кроме того, ссылка на данные цели и идентификатор должны быть уникальными, что может быть решено с помощью индекса цикла. Поэтому вместо того, чтобы вкладывать вашу карту в другую карту в карусели, вы можете попробовать это:

<div class="accordion" id="accordionExample">
  <div class="card" *ngFor="let name of namespaces; index as i">
      <div class="card-header" id="headingOne">
          <h2 class="mb-0">
            <button class="btn btn-link" type="button" data-toggle="collapse" attr.[data-target]="'collapse' + i">
              Collapsible Group Item {{i}}
            </button>
          </h2>
      </div>

      <div [id]="'collapse' + i" class="collapse show" data-parent="#accordionExample">
          <div class="card-body">
            {{name}}
          </div>
      </div>
  </div>
</div>

Другой вариант - использовать ng-bootstrap, библиотеку, которая поддерживает собственные элементы начальной загрузки. См. официальный аккордеон ng-bootstrap

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

Поскольку ваши пространства имен - это просто строковый массив, а не какая-либо древовидная структура, иерархии не будет. Вам просто нужно перебрать массив, используя ngFor. Используйте индекс итерации для сопоставления идентификатора, так как он должен быть уникальным.

<div id="accordion">
    <div class="card" *ngFor="let namespace of namespaces;let i=index">
        <div class="card-header">
            <h5 class="mb-0 d-inline">
                <button type="button" class="btn btn-link" data-toggle="collapse" attr.data-target="#collapse_{{i}}">
                    Toggle
                </button>
            </h5>
        </div>
        <div id="collapse_{{i}}" class="collapse" data-parent="#accordion">
            <!-- content -->
        </div>
    </div>
</div>

Удалите класс show при сжатии, иначе при запуске будут отключены все сбои.

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

Возможно, ваши данные поступают после загрузки вашего HTML-компонента, что может быть одной из причин. Вы можете добавить * ngIf = "namespaces" в свой код следующим образом:

<div class="container" style="color:black;" *ngIf="namespaces">
    <div id="accordion">
        <div class="card">
            <div class="card-header" id="headingOne">
                <h5 class="mb-0 d-inline">
                    <button type="button" class="btn btn-link" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                        Available Namespaces
                    </button>
                </h5>
                <a href="#" data-target="[data-parent='#child1']" data-toggle="collapse" class="my-2 float-right">toggle all</a>
            </div>
            <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
                <div class="card-body" id="child1">
                    <div class="card" *ngFor="let name of namespaces">
                        <div class="card-header">
                            <a href="#" data-toggle="collapse" data-target="#collapseOneA">{{name}}</a>
                        </div>
                        <div class="card-body collapse" data-parent="#child1" id="collapseOneA">
                            {{name}}
                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>
</div>

Надеюсь, это поможет.

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