0

My rest Api return { "id": 1, "userId": 1, "date": "2020-03-02T00:00:02.000Z", "products": [ { "productId": 1, "quantity": 4 }, { "productId": 2, "quantity": 1 }, { "productId": 3, "quantity": 6 } ], "__v": 0 } and I try to implement a Angular Material Table that show a cart of user selected by other table. I create a material module, service and interface... Can anybody help me understand what is causing the error here? I always get this error in the console: Provided data source did not match an array, Observable, or DataSource.

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Cart } from '../interfaces/cart';
import { CartsService } from '../services/carts.service';


@Component({
  selector: 'app-user-cart',
  templateUrl: './user-cart.component.html',
  styleUrls: ['./user-cart.component.css']
})
export class UserCartComponent implements OnInit {

  

  carts!: Cart[];
  
  displayedColumns: string[] = ['id','userId', 'date',  'products-id', 'products-quantity'];

  constructor(
    private cartsService: CartsService,
    private route: ActivatedRoute
  ) { }

  ngOnInit(): void {
    this.route.params.subscribe(response => this.cartsService.getCart(response.id)
    .subscribe(response => this.carts = response)
    );
  
  }

  

}

  
 <table mat-table [dataSource]="carts" class="mat-elevation-z8">

  <ng-container matColumnDef="id">
      <th mat-header-cell *matHeaderCellDef> Id </th>
      <td mat-cell *matCellDef="let cart"> {{cart.id}} </td>
    </ng-container> 

    <ng-container matColumnDef="userId">
        <th mat-header-cell *matHeaderCellDef> User Id </th>
        <td mat-cell *matCellDef="let cart"> {{cart.userId}} </td>
      </ng-container>
      
      <ng-container matColumnDef="date">
        <th mat-header-cell *matHeaderCellDef> Date </th>
        <td mat-cell *matCellDef="let cart"> {{cart.date}} </td>
      </ng-container> 

     <ng-container matColumnDef="products-id">
      <th mat-header-cell *matHeaderCellDef> Product Id </th>
      <td mat-cell *matCellDef="let row">
          <span *ngFor="let item of row.products">{{item.productId}}</span>
      </td>
    </ng-container>

    <ng-container matColumnDef="products-quantity">
        <th mat-header-cell *matHeaderCellDef> Quantity </th>
        <td mat-cell *matCellDef="let row">
            <span *ngFor="let item of row.products">{{item.quantity}}</span>
        </td>
      </ng-container> 
  
 <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;">
    </tr>
  </table>

export interface Cart {
    id: number,
    userId: number,
    date: string,
    products: Array<{productId: number, quantity: number}>,
    __v: number 
}

1
  • Can you try casting as Cart[] .subscribe(response => this.carts = response as Cart[]) Commented Nov 30, 2021 at 15:15

2 Answers 2

0

Not sure if that can solve your problem, but I don't think a list is required on your datasource.

I would suggest you try replacing:

carts!: Cart[];

By :

public carts: MatTableDataSource<Cart>;

with the related import of course: import { MatTableDataSource } from '@angular/material/table';

Sign up to request clarification or add additional context in comments.

Comments

0

Initialize the data source cart as below

carts = MatTableDataSource<Cart[]>;

import { MatTableDataSource } from '@angular/material/table';

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.