2016-11-10 9 views
2

入力変数サーバーを取り、この変数をテンプレートで使用する角度成分ランクエントリがあります。このコンポーネントは、ランク表コンポーネントによって使用されます。ランク表コンポーネントは、すべて異なるサーバーを表すランク・エントリのリストです。サーバーのリストは、サーバー・サービスから約束を得るランク表getServers()メソッドから取得されます。これはすべて期待通りに機能します。角度2の約束からコンポーネントに入力を渡す方法

ここでは、より具体的なサーバーディテールを作成しようとしています。これはroute/detail /:idからアクセスされ、このコンポーネントは、1つのサーバだけのランクエントリでなければならない1つの行だけを持つテーブルを作成します。私は、サーバサービスからgetServer(id)メソッドを使用することができると期待していました。サーバの詳細に約束されたサーバを与えてから、サーバをhtmlのランクエントリコンポーネントに渡すことができます。エラー:

私はランクエントリコンポーネントがサーバー・ディテール・コンポーネントによって作成されたときの約束がまだ解決されていないので、これは可能かもしれないと思うError: Uncaught (in promise): Error: Error in ./RankEntryComponent class RankEntryComponent - inline template:4:4 caused by: undefined is not an object (evaluating 'self.context.server.online')

とランクエントリは、サーバーを持っていませんオブジェクト?

ご協力いただきありがとうございます!

サーバーdetail.component.ts

import {Component, OnInit, Input } from '@angular/core'; 
import { ActivatedRoute, Params } from '@angular/router'; 
import { Location } from '@angular/common'; 

import { Server } from './utilities/Server'; 
import { ServerService } from './server.service'; 

@Component({ 
    selector: 'app-server-detail', 
    templateUrl: 'server-detail.component.html' 
}) 
export class ServerDetailComponent implements OnInit { 

    constructor(
    private route: ActivatedRoute, 
    private serverService: ServerService 
){} 

    @Input() 
    server: Server; 

    ngOnInit(): void { 
    this.route.params.forEach((params: Params) => { 
     let id = +params['id']; 
     this.serverService.getServer(id).then(server => {this.server = server}); 
    }) 
    } 

} 

ランクentry.component.ts

import { Component, Input } from '@angular/core'; 
import { Server } from './utilities/Server'; 

@Component({ 
    selector: 'tr[app-rank-entry]', 
    templateUrl: './rank-entry.component.html' 
}) 
export class RankEntryComponent { 

    @Input() 
    server: Server; 

} 

ランクentry.component.html

<th scope="row">{{server.rank}}</th> 
<td>{{server.name}}</td> 
<td><img [src]="this.server.img"/></td> 
<td>{{server.currPlayers}}/{{server.maxPlayers}}</td> 
<td *ngIf="server.online">Online</td><td *ngIf="!server.online">Offline</td> 

server.service。 ts

import { Injectable } from '@angular/core'; 

import { Server } from './utilities/Server'; 
import { SERVERS } from './utilities/mock-servers'; 

@Injectable() 
export class ServerService { 
    getServers(): Promise<Server[]> { 
    return Promise.resolve(SERVERS); 
    } 

    getServer(id: number): Promise<Server> { 
    return this.getServers().then(servers => 
     servers.find(server => server.id === id)); 
    } 

} 

そして私のサーバー-detail.component.htmlがちょうどそうのようなランクエントリコンポーネント作成:<tr app-rank-entry [server]="server"></tr>

を私はので、私は本当にヒーローでチュートリアルより多くの何も知らない角度2のみに新たなんです私はElvisオペレータのようなものを見てきました。と非同期パイプはどちらも動作しません! angular2観測可能で

+0

私はこの '

rank-entry.component.html
'がエラーを解決すると思います。 – fingerpich

答えて

0

は、観察が約束のその方法とは異なり、ストリーム

で、観測可能なのは、メソッドが複数呼び出すことができます購読する約束に似ているが、代わりに、メソッド

の購読方法を持っています時々、観測可能なものが放出される。さもなければ、約束と観測はほぼ同じです。

親コンポーネントから観察可能なストリームを子コンポーネントに渡すには、async pipeを使用します。ここで

は一例です...

親コンポーネント https://github.com/danday74/angular2-chartjs2/tree/master/app/components/stream-graph-parent

我々は呼んでいない非同期パイプを使用しているため、非同期パイプ 注意を経由してストリームにサブスクライブ子コンポーネント子供の中で購読する、これは角度で私たちのために自動的に行われます。 https://github.com/danday74/angular2-chartjs2/tree/master/app/components/stream-graph

関連する問題