Как использовать несколько угловых компонентов в цикле

#angular #typescript

#угловой #typescript

Вопрос:

Я создаю всплывающую панель уведомлений, где я буду показывать все нерейтинговые поставки заказов на покупку. Я не уверен, как бы я использовал *ngFor для его зацикливания.

У меня есть система, в которой пользователь может перейти и оценить доставку своего заказа. У каждого заказа есть своя страница рейтинга, где они оценивают заказ. Это делается с помощью пользовательского компонента (компонент звездного рейтинга).

Вопрос в том, что он отлично работает при использовании его на странице, но теперь мне также нужно напомнить пользователям через панель уведомлений, что есть нерейтинговые заказы, например «пожалуйста, оцените их сразу». Это делается с помощью модального компонента с повторяющимся рейтингом.

Теперь, когда я перебираю все нерейтинговые заказы, он отображается так, как ожидалось, но, когда я оцениваю один заказ, все остальные заказы также меняют свои оценки. Как мне это преодолеть?

 <ng-container *ngFor="let task of unratedOrders; let i = index">
                            <div class="col-md-3">
                                <div class="card">
                                    <div class="card-body r-wrapper__body">
                                        <div>
                                            <div class="avatarx">

                                            </div>
                                            <div class="header">
                                                <h3 class="card-title">Rate task {{task.orderId}}</h3>

                                            </div>
                                        </div>
                                        <div class="star-rating-size">
<!-- The rating component is here -->
                                            <star-rating id="{{task.orderId}}-rating-component" (ratingChange)="changeRating($event)" [controlIndex]="i" [ratings]="ratings" [(rating)]="supplierRating.ratingId"></star-rating>
                                        </div>
                                        <div class="r-info">
                                            <div class="r-info__icon">
                                                <i class="fa fa-info-circle" aria-hidden="true"></i>
                                            </div>
                                            <p>
                                                <span *ngIf="selectedRating"><b>{{selectedRating?.ratingHeader}}</b> - {{selectedRating?.ratingDesc}}</span>
                                            </p>
                                        </div>
                                        <textarea class="r-comment" name="" placeholder="Write a short comment.." id="" cols="30" rows="2" [(ngModel)]="supplierRating.description"></textarea>
                                        <button type="button" class="btn btn-sm" (click)="changeETA(task)">Change ETA</button>
                                        <button type="button" class="btn btn-primary btn-sm" (click)="submitRating($event)">Submit rating</button>
                                    </div>
                                </div>
                            </div>
                        </ng-container>
  

PS: Ниже приведен компонент

Кроме того, оценки, которые я передаю компоненту, являются данными для цикла оценки, обычно в качестве объекта передается 5 оценок. Затем в компоненте отображается 5 запусков.

 <fieldset class="rate" id="rate-{{controlIndex}}" [class.readonly]="readonly">
    <ng-container *ngFor="let star of ratings; let i = index">
        <input type="radio" id="rating-{{ratings.length-i-1}}-{{controlIndex}}" name="rating-{{controlIndex}}" [checked]="(star.id == rating)" />
        <label [class.half]="(i%2)==1" for="rating-{{ratings.length-i-1}}-{{controlIndex}}" (click)="updateRating(star.id)"></label>
    </ng-container> 
</fieldset>
  

введите описание изображения здесь

Как вы можете видеть, я проделал все трюки, вставив уникальный идентификатор и т.д., но не повезло!

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

1. Вы используете Angular, А НЕ AngularJS

2. Мой плохой, но дело не в этом.

3. Если возможно, предоставьте stackblitz

4. Боюсь, я не смогу воспроизвести его, упростив. Могу ли я вам чем-нибудь еще помочь?

5. @Kirk нет необходимости в реальном коде, просто образец тестируемого кода

Ответ №1:

idk, если вам действительно нужно использовать ваш компонент, если нет, есть модуль из ng-bootstrap для оценки запуска, который действительно прост в использовании, и вы можете легко сохранить ваши ставки в массиве

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

1. Добро пожаловать в StackOverflow, кстати, полезно знать, компонент классный, но у меня нет времени переписывать всю систему заново и тестировать ее. Есть ли какой-либо обходной путь для моего дерьмового кода здесь?

Ответ №2:

[ratings]=»рейтинги», разве это не должно быть [ratings]=»task.ratings» . Поскольку он находится в цикле, я думаю, вам нужно присвоить значение рейтинга текущему повторяющемуся элементу. Вероятно, поэтому все значения меняются при изменении одного.

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

1. Извините за запутанный код, но это массив, отправляемый компоненту для зацикливания всех 5 запусков. внутри компонента я повторяю массив для рендеринга 5 запусков. Так вот почему рейтинги.

2. Вам все равно понадобится ссылка на «task» в «unratedOrders», чтобы обновить рейтинги для этой одной задачи. Попробуйте привязать рейтинг к задаче.

Ответ №3:

Теперь я не вижу, как вы обновляете значение ratings, но я вижу, что вы привязываетесь к ОДНОМУ и тому ЖЕ ratings в каждом <star-rating> элементе, поскольку вы используете пользовательскую директиву, я не могу угадать внутреннюю работу. Но мне это кажется подозрительным.

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

1. Извините за запутанный код, но это массив, отправляемый компоненту для зацикливания всех 5 запусков. внутри компонента я повторяю массив для рендеринга 5 запусков. Так вот почему рейтинги.

2. Смотрите ответ Абхая Навина. У меня такая же мысль

Ответ №4:

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

Ваш код должен быть таким, как показано ниже

 unratedOrders - [{
orderId:1234
ratings:[{},{}]
}]


<div class="star-rating-size">
    <star-rating #starRating id="{{task.orderId}}-rating-component" (ratingChange)="changeRating($event,task)" [controlIndex]="i" [ratings]="task.ratings" [(rating)]="supplierRating.ratingId"></star-rating>
</div>

changeRating(event, selectedTask) {
    loop through unratedOrders and assing value to selected task
}
  

Ответ №5:

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

Ваш код должен быть таким, как показано ниже

 unratedOrders - [{
orderId:1234
ratings:[{},{}]
}]


<div class="star-rating-size">
    <star-rating [ratings]="task.ratings" (ratingChange)="changeRating($event,task)"  id="{{task.orderId}}-rating-component"  [controlIndex]="i"  [(rating)]="supplierRating.ratingId"></star-rating>
</div>

changeRating(event, selectedTask) {
    loop through unratedOrders and assing value to selected task
}