2017-09-27 19 views
0

MaterialテーブルでAngular(5)を使用して、MySQLデータベースからのデータを単純に表示しようとしています。私は正常にコンパイルしたコード、および列名とページ区切りボタンを持つテーブルが表示されますが、データが表に示されていません。私は、APIコールがデータを正しく返していることを知っています。サービスがAPIを呼び出していることがわかりました(ブラウザのネットワークインスペクタで正しいデータが表示されています)。エラーがunitTypeDatabase.data.lengthを参照するHTMLコード内の一部を参照しているように思われる角度5材料テーブルがサービスからデータを取得していない

TypeError: _co.unitTypeDatabase.data is undefined 
Stack trace: 
View_UnitTypeComponent_0/<@ng:///AppModule/UnitTypeComponent.ngfactory.js:136:9 ... 

のブラウザに表示されるエラーがあります。それが定義されていない場合は、テーブルにもデータが存在しない理由を説明します。私が理解できないのは、なぜが未定義であるかです。私はnew UnitTypeDatabaseの作成方法と場所/方法と関係があると思いますが、サービスが正常に呼び出されているとすれば、ここからどこに行くのか分かりません。ここで私が持っているコードです:

ユニット-type.component.ts

import { Component, OnInit, ViewChild } from '@angular/core'; 
import { UnitType } from './unit-type'; 
import { UnitTypeService } from './unit-type.service'; 
import {DataSource} from '@angular/cdk/collections'; 
import {MdPaginator} from '@angular/material'; 
import {Observable} from 'rxjs/Observable'; 
import {BehaviorSubject} from 'rxjs/BehaviorSubject'; 

@Component({ 
    selector: 'app-unit-type', 
    templateUrl: './unit-type.component.html', 
    styleUrls: ['./unit-type.component.scss'], 
    providers: [UnitTypeService] 
}) 
export class UnitTypeComponent implements OnInit { 
    public displayedColumns = ['unitTypeID', 'unitTypeName']; 
    public unitTypeDatabase: UnitTypeDatabase | null; 
    public dataSource: UnitTypeDataSource | null; 

    @ViewChild(MdPaginator) paginator: MdPaginator; 

    constructor(private unitTypeService: UnitTypeService) {} 

    ngOnInit() { 
     this.unitTypeDatabase = new UnitTypeDatabase(this.unitTypeService); 
     this.dataSource = new UnitTypeDataSource(this.unitTypeDatabase, this.paginator); 
    } 
} 

export class UnitTypeDataSource extends DataSource<UnitType> { 
    constructor(private _unitTypeDatabase: UnitTypeDatabase, private _paginator: MdPaginator) { 
     super(); 
    } 

    connect(): Observable<UnitType[]> { 
    const displayDataChanges = [ 
     this._unitTypeDatabase.dataChange, 
     this._paginator.page 
    ]; 

    return Observable.merge(...displayDataChanges).map(() => { 
     const data = this._unitTypeDatabase.data.slice(); 

     const startIndex = this._paginator.pageIndex * this._paginator.pageSize; 
     return data.splice(startIndex, this._paginator.pageSize); 
    }) 
    } 

    disconnect() {} 
} 

export class UnitTypeDatabase { 
    /** Stream that emits whenever the data has been modified. */ 
    public dataChange: BehaviorSubject<UnitType[]> = new BehaviorSubject<UnitType[]>([]); 
    get data(): UnitType[] { return this.dataChange.value; } 

    constructor(unitTypeService: UnitTypeService) { 
     unitTypeService.getAllUnitTypes().subscribe(data => this.dataChange.next(data)); 
    } 
} 

ユニット-type.component.html

<div class="example-container mat-elevation-z8"> 
    <md-table #table [dataSource]="dataSource"> 

    <!-- ID Column --> 
    <ng-container mdColumnDef="unitTypeID"> 
     <md-header-cell *mdHeaderCellDef> ID </md-header-cell> 
     <md-cell *mdCellDef="let row"> {{row.unitTypeID}} </md-cell> 
    </ng-container> 

    <!-- Name Column --> 
    <ng-container mdColumnDef="unitTypeName"> 
     <md-header-cell *mdHeaderCellDef> Name </md-header-cell> 
     <md-cell *mdCellDef="let row"> {{row.unitTypeName}} </md-cell> 
    </ng-container> 

    <md-header-row *mdHeaderRowDef="displayedColumns"></md-header-row> 
    <md-row *mdRowDef="let row; columns: displayedColumns;"></md-row> 
    </md-table> 

    <md-paginator #paginator 
      [length]="unitTypeDatabase.data.length" 
      [pageIndex]="0" 
      [pageSize]="25" 
      [pageSizeOptions]="[5, 10, 25, 100]"> 
    </md-paginator> 
</div> 

ユニット-type.tsは

export class UnitType { 
    constructor(
     public unitTypeID: number, 
     public unitTypeName: string 
    ){} 
} 

ユニット-type.service.ts

import { Injectable } from '@angular/core'; 
import { UnitType } from './unit-type'; 
import { Headers, Http } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class UnitTypeService { 
    private unit_types_Url = 'api/unit-types'; // URL to web api 
    private headers = new Headers({'Content-Type': 'application/json'}); 

    constructor(private http: Http) { } 

    getAllUnitTypes(): Observable<UnitType[]> { 
    return this.http.get(this.unit_types_Url) 
      .map(response => response.json().data as UnitType[]); 
    } 
} 

私は素材のサイトから例を開始するが、それはサービスを使用してデータを取得しません。私もHow to use md-table with services in Angular 4の質問と回答にマッチさせようとしましたが、何かが欠けているはずです。うまくいけば、誰かがすぐに見つけ出すことができる、明らかで単純な誤りまたは誤解です。ありがとう!

編集 フルスタックトレースは次のとおりです。

ERROR TypeError: _this._unitTypeDatabase.data is undefined 
Stack trace: 
[208]/UnitTypeDataSource.prototype.connect/<@http://localhost:4200/main.bundle.js:93:17 
[email protected]://localhost:4200/vendor.bundle.js:51417:22 
[email protected]://localhost:4200/vendor.bundle.js:37214:13 
[email protected]://localhost:4200/vendor.bundle.js:48573:9 
[email protected]://localhost:4200/vendor.bundle.js:117362:9 
[email protected]://localhost:4200/vendor.bundle.js:37214:13 
[email protected]://localhost:4200/vendor.bundle.js:26457:17 
[email protected]://localhost:4200/vendor.bundle.js:49978:9 
UnitTypeDatabase/<@http://localhost:4200/main.bundle.js:122:78 
[email protected]://localhost:4200/vendor.bundle.js:37363:13 
[email protected]://localhost:4200/vendor.bundle.js:37310:17 
[email protected]://localhost:4200/vendor.bundle.js:37250:9 
[email protected]://localhost:4200/vendor.bundle.js:37214:13 
[email protected]://localhost:4200/vendor.bundle.js:51423:9 
[email protected]://localhost:4200/vendor.bundle.js:37214:13 
[email protected]://localhost:4200/vendor.bundle.js:53409:21 
[email protected]://localhost:4200/polyfills.bundle.js:6443:17 
[email protected]://localhost:4200/vendor.bundle.js:4914:24 
[email protected]://localhost:4200/polyfills.bundle.js:6442:17 
[email protected]://localhost:4200/polyfills.bundle.js:6242:28 
ZoneTask/[email protected]://localhost:4200/polyfills.bundle.js:6496:28 

enter image description here

答えて

0

問題はunit-type.service.tsにあります。それは次のようになります。私はそうとすぐにそれはすべての情報が表示され、正しく表に表示された削除されたように、データオブジェクトが返さJSONの一部として存在しないという事実を逃した

getAllUnitTypes(): Observable<UnitType[]> { 
    return this.http.get(this.unit_types_Url) 
      .map(response => response.json() as UnitType[]); 
} 

1

で始まるために、テンプレートにエルビス演算子?を使用してみてください。それがテンプレートの問題だけであれば、それはあなたの問題を解決するはずです。ビューは、それが唯一のngOnInit()に初期化されると、まだ定義されたunitTypeDatabaseがないレンダリングされるとき

[length]="unitTypeDatabase?.data?.length" 

理由があります。それが問題を解決するかどうかを確認してください。

+0

チップをありがとうが、残念ながらそれは問題を解決しませんでした。以前と同じようにブラウザで同じエラーが表示されます。 – Tim

+0

エラーの完全なスタックトレースを表示できますか? – amal

+0

質問を編集して完全なスタックトレースを表示しました。 – Tim

関連する問題