Можно ли использовать *ngFor для заполнения нескольких родительских элементов?

Я хочу использовать div как контейнер. В этом контейнере я хотел бы заполнить до 3 элементов *ngFor или же *ngRepeat, После того, как этот предел будет достигнут, я хотел бы новый экземпляр родительского div быть сгенерированным для продолжения заполнения данных.

Пока я пробовал это

<!-- I want to create a new instance of this once 3 elements are generated in it -->
<div *ngFor="let link of homeIntroData?.links; let i=index;" class="">

    <!-- This is what I want to generate up to 3 times before a new container is generated -->  
    <div *ngIf="i<3" class="" >
        <div class="card">
            <p class="" routerLink="" routerLinkActivate="">
                {{link.link}}
            </p>
        </div>
    </div>

Я сталкивался с этим Angular 2: как применить ограничение к *ngFor?

который я изначально считал ответом, но он ограничивает элемент тремя записями, плюс он применяется ко всему контейнеру, а не к элементу внутри него. Я хочу, чтобы они проходили по экрану по горизонтали в ряды по 3, а не по 1 ряду.

До сих пор я обнаружил, что я должен переместить *ngFor а также *ngIf кодирование в дочерний элемент, как это

<div class="">

    <div *ngFor="let link of homeIntroData?.links; let i=index;" class="">
        <div *ngIf="i<3"  class="card">
            <p class="" [routerLink]="" routerLinkActivate="">
                {{link.link}}
            </p>
        </div>
    </div>

</div>

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

До сих пор я сталкивался с этим https://github.com/michaelbromley/ng2-pagination который предназначен для нумерации страниц, но он, по сути, делает то, что я хочу, так или иначе. Я подумал, что мне нужно как-то сказать, чтобы показывать 2 страницы одновременно. Чем больше я читаю, тем больше я запутываюсь, пытаясь понять, как использовать его так, как мне нужно.

До сих пор я думаю, что мне нужно создать собственную трубу для привязки к *ngIf в родительском div чтобы заставить его делать то, что я хочу, когда у него есть 3 дочерних элемента. Прежде чем я отправлюсь в это путешествие, я хотел бы узнать, есть ли какой-нибудь возможный способ сделать это с Angular 2 из коробки. Если нет, как я могу этого достичь? Заранее спасибо.

ОБНОВИТЬ

Plunker размещен yurzui в комментариях именно то, что мне нужно сделать, что вы можете посмотреть здесь https://plnkr.co/edit/q9olLVsEcGrskv8oQkV7?p=preview. Я начал применять его на своем сайте и столкнулся с несколькими проблемами.

Для начала я использую firebase в качестве базы данных с angularfire2. Это означает, что у меня есть один огромный объект с другими большими объектами с несколькими объектами, которые на самом деле являются массивами данных того же типа. Из-за этого единственный способ, которым у меня есть привязка, работает должным образом как это.

<div *ngFor="let link of homeIntroData$?.links" class="row home_link_container">

    <div *ngFor="let link of pipe" class="col-4">
        <div class="card">
            <p class="home_link" [routerLink]="'/home/'+link.val" routerLinkActivate="active">
                {{link.link}}
            </p>
        </div>
    </div>

</div>

Не могу сказать

<div *ngFor="links of homeIntroData$">

так как homeIntroData$ Сам по себе не массив. Где в плунжере "Великий Юрзуй" придуман, он настроен так

<div *ngFor="let chunk of items | chunks: 3" class="row">

    <div *ngFor="let item of chunk" class="card">
        <p>
            {{item}}
        </p>
    </div>

</div>

Который я еще даже не начал копать, чтобы заставить трубу работать, потому что я застрял в том, как получить мои данные способом, который позволит мне применить это. Здесь важно загружать links в родительский элемент с ограничением в 3 дочерних элемента, затем дочерний элемент, который загружает link 3 раза на одного родителя, как в вантузе.

Я наткнулся на этот пост https://github.com/angular/angular/issues/6392 котором говорится о проблеме, когда данные не являются массивом, и предлагается разбить эти данные на куски, на которые мы можем напрямую ссылаться. Таким образом, я изменил класс моего компонента, как это

export class HomeIntroComponent implements OnInit {

    private homeIntroData$: FirebaseObjectObservable<any>;

    //added this to call in the template
    private homeIntroLinks$:    FirebaseListObservable<any>;

    constructor(private _homeService: HomeService) {}

    ngOnInit() {
        this._homeService.getHomeIntroData().subscribe(HomeIntroData =>{
            this.homeIntroData$ = HomeIntroData;

            //used the same class from the service to go directly to links
            this.homeIntroLinks$ = HomeIntroData.links;
            console.log(this.homeIntroLinks$);
        });
    }

}

Видя, что я должен использовать {{link.link}} в привязке, чтобы получить все, чтобы показать, я подумал, что я мог бы сойти с создания дочернего элемента, как это

<div *ngFor="let link of link" class="col-4">
    <div class="card">
        <p class="home_link" [routerLink]="'/home/'+link.val" routerLinkActivate="active">
            {{link}}
        </p>
    </div>
</div>

но конечно я получаю ошибку о [object object] снова. Поэтому я действительно не могу понять, как вызвать мои данные для работы с этим. Экспортируемый JSON для homeIntroData является

"home_intro" : {
    "links" : [ {
        "link" : "I need to expand my current brand.",
        "val" : "expand"
      }, {
        "link" : "I need to re-create my Brand.",
        "val" : "recreate"
      }, {
        "link" : "I need to build a Brand for my new Business.",
        "val" : "new-business"
      }, {
        "link" : "I need to build a Brand for my new product.",
        "val" : "new-product"
      }, {
        "link" : "I have a technical difficulty that requires an Artist.",
        "val" : "tech-difficulty"
      } ]
    }

Другое дело, если вы посмотрите в плункер, вы увидите, что Юрзуй добавил chunk к привязке, как это

<div *ngFor="let chunk of items | chunks: 3" class="row">
    <div *ngFor="let item of chunk" class="card">
      <p>
        {{item}}
       </p>
    </div>
  </div>

Если вы посмотрите через остальную часть app.ts файл, который вы увидите, он нигде не определен. Там в chunks в трубе, и chunkSize в PipeTransform, но нет chunk, Я даже поиграл с этим и изменил его название на что-то совершенно другое, что никак не имело никакого отношения к чанку, и это ВСЕ ЕЩЕ РАБОТАЛО!!! Почему как?

0 ответов

Другие вопросы по тегам