Проблема доступа к объекту в другом массиве объектов в Angular

#html #angular

#HTML #angular

Вопрос:

Я думаю, что моя тема уже рассматривалась в Stack Overflow, но я ее не нашел. У меня есть ProductOrders, который содержит массив ProductOrder, и внутри каждого ProductOrder у меня есть Product. Я просто хочу представить название и цену текущего продукта в моем ngFor, но я не знаю, почему это не работает, в то время как автозаполнение находит эти две переменные…

Мой HTML-код

     <ul class="list-group"  *ngFor="let order of productOrders">
        <li class="list-group-item">{{order.quantity}}</li>
        <li class="list-group-item">{{order.user}}</li>
        <li class="list-group-item">{{order.product.id}}</li>
        <li class="list-group-item">{{order.product.name}}</li>
        <li class="list-group-item">{{order.product.pictureUrl}}</li>
    </ul>

  

Мой компонент проверки списка с помощью loadValidateOrders()

 

export class ListValidateOrderComponent implements OnInit {
   productOrders: ProductOrder[] = [];
   products: Product[] = [];
   sub: Subscription;
   private roles: string[];
   isLoggedIn = false;
   showAdminBoard = false;
   showModeratorBoard = false;
   errorMessage = '';
   username: string;

   private shoppingCartOrders: ProductOrders;

 constructor(private ecommerceService: EcommerceService,
       private userService: UserService, 
           private tokenStorageService: TokenStorageService) {

            }

 ngOnInit() {
   this.loadValidateOrders();

                   this.isLoggedIn = !!this.tokenStorageService.getToken();

   if (this.isLoggedIn) {
     const user = this.tokenStorageService.getUser();
     this.roles = user.roles;

     this.showAdminBoard = this.roles.includes('ROLE_ADMIN');
     this.showModeratorBoard = this.roles.includes('ROLE_MODERATOR');

     this.username = user.username;
       }

 }

 loadValidateOrders() {
   const user = this.tokenStorageService.getUser();
   this.ecommerceService.getAllActiveOrders()
    .subscribe(
               (products: any[]) => {
                   this.products = products;
                   this.products.forEach(product => {
                       this.productOrders.push(new ProductOrder(product, product.quantity, user.id));
                   })
               },
               (error) => console.log(error)
           );
    console.log(this.productOrders);

   }


}
  

Моя модель заказов на товары

 import { ProductOrder } from './product-order.model';
export class ProductOrders {
    productOrders: ProductOrder[] = [];
}

  

Моя модель заказа продукта

 import {Product} from "./product.model";

export class ProductOrder {
    product: Product;
    quantity: number;
    user: number;


    constructor(product: Product, quantity: number, user:number) {
        this.product = product;
        this.quantity = quantity;
        this.user = user;


    }
}

  

И моя модель продукта

 export class Product {
    id: number;
    name: string;
    price: number;
    pictureUrl: string;

    constructor(id: number, name: string, price: number, pictureUrl: string) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.pictureUrl = pictureUrl;

    }
}

  

Мой контроллер на задней стороне Springboot

 
@RestController
@RequestMapping("/api/auth/orders")
@CrossOrigin()
public class OrderController {

    ProductService productService;
    OrderService orderService;
    OrderProductService orderProductService;
    UserService userService;
    OrderProductRepository orderProductRepository;
    ProductRepository productRepository;

    public OrderController(ProductService productService, 
            OrderService orderService, 
            OrderProductService orderProductService,
            OrderProductRepository orderProductRepository,
            ProductRepository productRepository

            ) {
        this.productService = productService;
        this.orderService = orderService;
        this.orderProductService = orderProductService;
        this.orderProductRepository = orderProductRepository;
        this.productRepository = productRepository;

    }
    @GetMapping("/getAllOrders")
    public Iterable<OrderProduct> listOrderActive() {
        return orderProductRepository.findByActiveFalse();
    }

  

И моя модель OrderProduct

 
@Entity
@Table(name="OrderProduct")
public class OrderProduct {

    @EmbeddedId
    @JsonIgnore
    private OrderProductPK pk;

    @Column(name="QUANTITY", nullable = false) private Integer quantity;
    
    @Column(name="USER", nullable = false) private Integer user;

    @Column(name="ORDERING_DATE", nullable = true) private Date dateOrdering;
    
    @Column(name="DELIVER_DATE", nullable = true) private Date dateDeliver;
        
    private boolean active;

  

Массивы, отображаемые в console.log

Ответ №1:

вам нужно использовать тег into *ngFor, чтобы указать массив массива, а не «БОЛЬШОЙ» массив.

практический пример:

 <ul class="list-group"  *ngFor="let order of productOrders.productOrder">
    <li class="list-group-item">{{order.quantity}}</li>
    <li class="list-group-item">{{order.user}}</li>
    <li class="list-group-item">{{order.product.id}}</li>
    <li class="list-group-item">{{order.product.name}}</li>
    <li class="list-group-item">{{order.product.pictureUrl}}</li>
</ul>
  

(лучше всего использовать не order, а product для имени локальной переменной)

вам нужно использовать .ProductOrder, потому что вам нужен доступ к одному продукту не во всем массиве

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

1. это хорошая идея, но это не работает, потому что идентификатор ‘ProductOrder’ не определен. ‘ProductOrder[]’ не содержит такого элемента… Может быть, я должен что-то добавить в свой component.ts? Я добавил консоль. войдите в мой пост, чтобы помочь вам ^^

2. существует проблема с данными, у вас нет продукта в ProductOrder, если вы хотите видеть только продукты, создайте новый массив с именем products и выполняйте цикл по нему. это проще, чем цикл по порядку

3. Как я могу это сделать …? Я не настолько профессионален в Angular, даже код в моем контроллере, это слишком сложно для меня ^^

4. producst = productOrders.ProductOrder;

5. и выполните ngFor для продуктов