代码之家  ›  专栏  ›  技术社区  ›  Marcus Grass

角类型脚本订阅值为空,但数据仍提供给模板

  •  0
  • Marcus Grass  · 技术社区  · 8 年前

    我对棱角和字体很陌生,遇到了一个对我来说似乎很奇怪的问题。 我试图构建一个mat表,并使用类的值创建mattabledatasource对象。我从get请求获取值到后端,但是每当我尝试在组件中使用恢复的值时,这些值都是空的,但是当加载模板时,它们突然出现了。

    这是我的组件:

    import { Component, OnInit, ViewChild } from '@angular/core';
    import { first } from 'rxjs/operators';
    import { MatTableDataSource } from '@angular/material/table';
    import { MatPaginator, MatSort } from '@angular/material';
    
    import { Invoice } from '../_models';
    import { InvoiceService } from '../_services';
    
    @Component({
      selector: 'app-invoices',
      templateUrl: './invoices.component.html',
      styleUrls: ['./invoices.component.css']
    })
    export class InvoicesComponent implements OnInit {
      displayedColumns=['rating', 'amount', 'debtor', 'serial', 'dateout', 'expiration', 'daysleft', 'fid']
      invoices: Invoice[] = [];
      dataSource= new MatTableDataSource<Invoice>(this.invoices);
    
      @ViewChild(MatPaginator) paginator: MatPaginator;
      @ViewChild(MatSort) sort: MatSort;
    
      constructor(
        private invoiceService: InvoiceService
      ) { }
    
      ngOnInit() {
        this.loadInvoices();
        console.log(this.invoices);
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
      }
      private loadInvoices(){
        this.invoiceService.getUserInvoices().pipe(first()).subscribe(invoices => {
          this.invoices=invoices;
        });
        console.log(this.invoices);
    
    
      }
      applyFilter(filterValue: string) {
        filterValue = filterValue.trim(); // Remove whitespace
        filterValue = filterValue.toLowerCase(); // Datasource defaults to lowercase matches
        this.dataSource.filter = filterValue;
        if (this.dataSource.paginator) {
          this.dataSource.paginator.firstPage();
        }
      }
    
    }
    

    下面是模板:

    <h3> All Uploaded invoices:</h3>
    <mat-form-field>
        <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
    </mat-form-field>
    <div class="mat-elevation-z8">
      <mat-table #table [dataSource]="invoices" matSort class="mat-elevation-z8">
    
        <ng-container matColumnDef="rating">
          <mat-header-cell *matHeaderCellDef mat-sort-header> Rating </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.rating}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="amount">
          <mat-header-cell *matHeaderCellDef mat-sort-header> Amount </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.amount}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="debtor">
          <mat-header-cell *matHeaderCellDef> Debtor </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.debtor}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="serial">
          <mat-header-cell *matHeaderCellDef> Serial </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.serial}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="dateout">
          <mat-header-cell *matHeaderCellDef> Dateout </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.dateout}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="expiration">
          <mat-header-cell *matHeaderCellDef> Expiration </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.expiration}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="daysleft">
          <mat-header-cell *matHeaderCellDef mat-sort-header > Days left </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.daysleft}} </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="fid">
          <mat-header-cell *matHeaderCellDef> Fid </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.fid}} </mat-cell>
        </ng-container>
    
    
        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
      </mat-table>
      <mat-paginator [pageSizeOptions]="[3, 100, 200]" showFirstLastButtons></mat-paginator> 
    </div>
    <p><a [routerLink]="['/login']">Logout</a></p>
    

    重要的是 [dataSource]="invoices" ,因为这将填充从loadInvoices方法启动的get请求中收集的数据。如果我把它改成 [dataSource]="dataSource" 它以空数组的形式出现。类似地,我的console.logs都输出一个空数组。有没有办法使用我的请求中的数据来创建mattabledatasource对象并将其传递给模板,如果有,我该怎么做?

    @diabolicwords解决后的新组件:

    import { Component, OnInit, ViewChild } from '@angular/core';
    import { first } from 'rxjs/operators';
    import { MatTableDataSource } from '@angular/material/table';
    import { MatPaginator, MatSort } from '@angular/material';
    
    import { Invoice } from '../_models';
    import { InvoiceService } from '../_services';
    
    @Component({
      selector: 'app-invoices',
      templateUrl: './invoices.component.html',
      styleUrls: ['./invoices.component.css']
    })
    export class InvoicesComponent implements OnInit {
      displayedColumns=['rating', 'amount', 'debtor', 'serial', 'dateout', 'expiration', 'daysleft', 'fid']
      dataSource: MatTableDataSource<Invoice>;
    
      @ViewChild(MatPaginator) paginator: MatPaginator;
      @ViewChild(MatSort) sort: MatSort;
    
      constructor(
        private invoiceService: InvoiceService
      ) { }
    
      ngOnInit() {
        this.loadInvoices();
      }
      private loadInvoices(){
        this.invoiceService.getUserInvoices().pipe(first()).subscribe(invoices => {
          this.dataSource = new MatTableDataSource<Invoice>(invoices);
          this.dataSource.paginator = this.paginator;
          this.dataSource.sort = this.sort;
        });
    
    
      }
      applyFilter(filterValue: string) {
        filterValue = filterValue.trim(); // Remove whitespace
        filterValue = filterValue.toLowerCase(); // Datasource defaults to lowercase matches
        this.dataSource.filter = filterValue;
        if (this.dataSource.paginator) {
          this.dataSource.paginator.firstPage();
        }
      }
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Lynx 242    8 年前

    问题在于订阅一个可观察到的。console.log()-调用的处理时间比返回的值早得多。这就是为什么你总是看到空的物体,尽管几毫秒后,它们充满了数据。

    这样试试:

     ngOnInit() {
       this.loadInvoices();
     }
    
     private loadInvoices(){
       this.invoiceService.getUserInvoices().pipe(first()).subscribe(invoices => {
         this.invoices=invoices;
         console.log(this.invoices);
         this.dataSource = new MatTableDataSource<Invoice>(this.invoices); 
         this.dataSource.paginator = this.paginator;
         this.dataSource.sort = this.sort;
       });
     }
    
    推荐文章