2016-03-28 13 views
12

Pracuję z kodu szybkiego startu Angular 2 w pliku app.component.ts.Angular 2 Więcej niż jeden składnik na tej samej stronie

Plik wygląda następująco:

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    template: `<h1>Title Here</h1>' 
}) 
export class AppComponent { } 

to działa zgodnie z oczekiwaniami.

Co chcę zrobić jest dodanie kolejnego elementu na tej samej stronie ... więc próbowałem to:

import {Component} from 'angular2/core'; 
import {ComponentTwo} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    template: `<h1>Title Here</h1>' 
}), 

@Component({ 
    selector: 'appTwo', 
    template: `<h1>Another Title Here</h1>' 
}) 
export class AppComponent { } 

to nie działa ... Czy to, że robię coś złego czy to nie jest dozwolone?

Odpowiedz

19

Nie możesz mieć dwóch składników root z tym samym selektorem na swojej stronie, nie możesz też mieć dwóch dekoratorów @Component() na tej samej klasie.

Jeśli komponenty mają różne selektorów, wystarczy uruchomić bootstrap dla każdego składnika głównego

@Component({ 
    selector: 'app', 
    template: '<h1>AppComponent1</h1>' 
}) 
export class AppComponent1 { } 

@Component({ 
    selector: 'appTwo', 
    template: '<h1>AppComponent2</h1>' 
}) 
export class AppComponent2 { } 


bootstrap(AppComponent1) 
bootstrap(AppComponent2) 

Jest kwestią otwartą wspierać nadrzędny przełącznik, aby móc dodać korzeń składnik wielokrotnie
- https://github.com/angular/angular/issues/915

+0

https://github.com/angular/angle/issues/915? Jakie mogą być potencjalne korzyści z przesłonięcia selektorów? – shiv

+0

Można dodać ten sam składnik root wiele razy, ale nie do tego samego selektora. –

+0

Zastanawiam się, czy istnieje jakaś korzyść lub powód, aby mieć wiele bootstrapowanych komponentów "root" ... jakiś pomysł? @ GünterZöchbauer –

3

Nie możesz mieć komponentu z dekoratorami dwu komponentowymi (@Component). Musisz utworzyć dwie różne klasy do tego:

@Component({ 
    selector: 'app', 
    template: `<h1>Title Here</h1>` 
}) 
export class AppComponent { } 

@Component({ 
    selector: 'appTwo', 
    template: `<h1>Another Title Here</h1>` 
}) 
export class AppComponent1 { } 

Następnie można użyć podejścia z odpowiedzią Guntera ...

-2

Incase jest to pomocne dla każdego, może zrobić to samo z iframe. Wykonane próbki można zobaczyć tutaj: http://plnkr.co/edit/xWKGS6

Zasadniczo używam iframe załadować html widget

<iframe src="widget.html" width="500" height="400" style="border:none; background-color:#ccc"> 
    </iframe> 

widget jest normalna strona angular2 html

+2

Korzystanie z usługi wspólnej do komunikacji z innymi komponentami nie będzie jednak tak łatwe. –

+1

Tak, ale przykład dotyczył bardziej tego samego komponentu, z którego korzystano, niezależnie od innych. tak jak scenariusz z widżetem, powiedzmy na przykład, czy aplikacja wyświetla, czy z różnych miast w różnych miejscach w witrynie. Pomyślałem, że byłby to jedyny powód, dla którego ktoś chciałby załadować go więcej niż jeden tak czy inaczej tbh :) – MSwehli

+0

Używanie iframe nigdy nie jest dobrym pomysłem z powodu braku kontroli –

Powiązane problemy