2016-06-17 15 views
0

私はangular2の公式チュートリアルに続き、「2.ヒーローエディタ」を作ろうとしています。 app.component.tsファイルには、HeroとAppComponentという2つのクラスがあります。なぜ角度2コンポーネントでクラスの順序が重要になるのですか?

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

@Component({ 
    selector: 'my-app', 
    template: ` 
    <h1>{{title}}</h1> 
    <h2>{{hero.name}} details!</h2> 
    <div><label>id: </label>{{hero.id}}</div> 
    <div> 
     <label>name: </label> 
     <input [(ngModel)]="hero.name" placeholder="name"> 
    </div> 
    ` 
}) 

export class Hero { 
    id: number; 
    name: string; 
} 

export class AppComponent { 
    title = 'Tour of Heroes'; 
    hero: Hero = { 
    id: 1, 
    name: 'Windstorm' 
    }; 
} 

AppComponentはメンバータイプが 'Hero'クラスなので、HeroはAppComponentの前に宣言する必要があると考えました。 しかし、奇妙なエラーメッセージが以下のように表示されました。

EXCEPTION: No Directive annotation found on AppComponent 

私がHeroクラスをAppComponentの次に移動したとき、それは機能します...そして、なぜ私はそれを知りません。 アドバイスをいただければ幸いです。ありがとう。

+0

また、クラスは吊り上げられません。 @Component({selector: 'b'})class B {} 'これは、クラス名を使用していない場合、クラス名を' @Component({selector: 'a'、directives:[B]なぜなら 'B'は' directives'でまだ知られていないからです。これには 'directref:[forwardRef(()=> B)]'が必要です。それはちょうどあなたの質問のタイトルに関連しています。 @ sasxaはエラーメッセージの実際の回答をすでに提供しています。 –

+0

はい。今私はクラスの順序が重要であることを知っています。追加情報ありがとう! –

答えて

1

デコレータ(たとえば、@Component)は、直後のオブジェクトで機能します。あなたのコードは次のようになります。

@Component({...}) 
class Hero {} 

@Component({...}) 
class AppComponent {} 

あなたはJavaScript例を見れば:

app.AppComponent = 
    ng.core.Component({ 
    }) 
    .Class({ 
    }); 

あなたが1つのファイルに書き込み、複数のクラスなら、あなたは、また、なぜ...

を見ることができます注文すること。 JavaScriptは順番に実行されますが、まだ定義されていないものを尋ねると、エラーが発生します。

+0

はい。私は1つのファイルで複数のクラスを使用します。なぜ私のコードが間違っているのかまだ理解できません...あなたが言ったように、クラス 'Hero'はAppComponentクラスのすぐ前に定義されています。 –

+0

Sasxaの最初のステートメントはクリスタルクリアです。デコレータ(@Component)は、その直後のファーストクラス(コード:Hero)の後ろに結び付けられます。あなたはHeroをコンポーネントにしているので、AppComponentは通常のクラスです。コンポーネントとして通常のクラスを使用することはできません。そのため、エラーが発生します。 –

+0

ああ...今はすべて明らかです。私はSasxaの最初の陳述を見落としました。私のせいです。どうもありがとう! –

関連する問題