2016-06-17 2 views
0

Я следую за официальным уроком angular2 и собираюсь сделать «2. The Hero Editor». В файле app.component.ts у меня есть два класса, Hero и AppComponent.Почему порядок классов имеет значение в угловом 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 имеет тип элемента класса «героя», я думал, герой должен объявлен перед AppComponent. Но тогда появилось странное сообщение об ошибке, как показано ниже.

EXCEPTION: No Directive annotation found on AppComponent 

И когда я переместил класс Hero на следующий AppComponent, он работает ... и я не знаю почему. Любой совет будет оценен по достоинству. Благодарю.

+0

Также классы не подняты. Если вы используете имя класса, например '@Component ({selector: 'a', директивы: [B]}) класс A {} @Component ({selector: 'b'}) class B {}' это не будет потому что 'B' еще не известен в' директивах', потому что он объявлен ниже. Для этого потребовались бы 'директивы: [forwardRef (() => B)]'. Это просто связано с названием вашего вопроса. @sasxa уже предоставил фактический ответ на ваше сообщение об ошибке. –

+0

Да. теперь я знаю, что последовательность классов важна. Благодарим вас за дополнительную информацию! –

ответ

1

Декораторы (@Component например) работают над объектами, которые находятся прямо за ними. Ваш код должен быть:

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

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

Если вы посмотрите на JavaScript Например:

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

вы можете понять, почему ...

Кроме того, если вы записи нескольких классов в одном файле , порядок имеет значение. JavaScript выполняется последовательно, если вы запрашиваете то, что еще не определено, вы получите сообщение об ошибке.

+0

Да. Я использую несколько классов в одном файле. но я не могу понять, почему мой код ошибочен ... Как вы сказали, класс «Герой» определен непосредственно перед классом AppComponent. –

+0

Первое утверждение Sasxa кристально ясно: Decorators (@Component) будут связаны с первым классом сразу после них (в вашем коде: Hero). Таким образом, вы создаете компонент Hero, а AppComponent - это просто обычный класс. Вы не можете использовать обычный класс как Component, и именно поэтому ошибка. –

+0

Ahhh ... теперь все ясно. Я забыл первое заявление Саши о моей ошибке. Большое спасибо! –

Смежные вопросы