Próbuję skonfigurować system zakładek, który pozwala komponentom rejestrować się (z tytułem). Pierwsza karta jest jak skrzynka odbiorcza, istnieje wiele działań / elementów do wyboru dla użytkowników, a każde z tych kliknięć powinno umożliwiać utworzenie nowego komponentu po kliknięciu. Działania / linki pochodzą z JSON.
Utworzony wystąpienie komponentu zostanie następnie zarejestrowane jako nowa karta.
Nie jestem pewien, czy jest to najlepsze podejście? Jak dotąd, jedyne przewodniki, które widziałem, dotyczą kart statycznych, co nie pomaga.
Do tej pory mam tylko usługę kart, która jest ładowana głównie w celu zachowania w całej aplikacji. Wygląda to mniej więcej tak:
export interface ITab { title: string; }
@Injectable()
export class TabsService {
private tabs = new Set<ITab>();
addTab(title: string): ITab {
let tab: ITab = { title };
this.tabs.add(tab);
return tab;
}
removeTab(tab: ITab) {
this.tabs.delete(tab);
}
}
Pytania:
- Jak mogę mieć dynamiczną listę w skrzynce odbiorczej, która tworzy nowe (różne) karty? Zgaduję,
DynamicComponentBuilder
że zostaną wykorzystane? - Jak można tworzyć komponenty ze skrzynki odbiorczej (po kliknięciu) zarejestrować się jako zakładki, a także wyświetlić? Zgaduję
ng-content
, ale nie mogę znaleźć wielu informacji o tym, jak z niego korzystać
EDYCJA: próba wyjaśnienia.
Pomyśl o skrzynce odbiorczej jak o skrzynce pocztowej. Elementy są pobierane jako JSON i wyświetla kilka elementów. Po kliknięciu jednego z elementów tworzona jest nowa karta z „typem” działania tego elementu. Typ jest wówczas składnikiem.
EDYCJA 2: Zdjęcie .
Odpowiedzi:
aktualizacja
Przykład Angular 5 StackBlitz
aktualizacja
ngComponentOutlet
został dodany do 4.0.0-beta.3aktualizacja
Trwają
NgComponentOutlet
prace, które robią coś podobnego https://github.com/angular/angular/pull/11235RC.7
Przykład plunkera RC.7
Przykład użycia
Zobacz także angular.io DYNAMICZNY ŁADOWARKA KOMPONENTÓW
starsze wersje xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Zmieniło się to ponownie w Angular2 RC.5
Zaktualizuję poniższy przykład, ale jest to ostatni dzień przed wakacjami.
Ten przykład Plunkera pokazuje, jak dynamicznie tworzyć komponenty w RC.5
Aktualizacja - użyj ViewContainerRef .createComponent ()
Ponieważ
DynamicComponentLoader
jest przestarzałe, podejście musi zostać ponownie zaktualizowane.Przykład plunkera
RC.4 Przykład plunkera beta.17
Aktualizacja - użyj loadNextToLocation
Przykład plunkera beta.17
oryginalny
Nie jestem do końca pewien, jakie są twoje wymagania, ale myślę, że powinno to zrobić, co chcesz.
Tabs
Komponent pobiera tablicę typów minęły i tworzy „zakładki” dla każdego elementu w tablicy.Przykład plunkera beta.15 (nie oparty na twoim Plunkerze)
Istnieje również sposób przekazywania danych, które mogą być przekazywane do dynamicznie tworzonego komponentu, takiego jak (
someData
musiałby być przekazywany jaktype
)Istnieje również pewne wsparcie dla stosowania wstrzykiwania zależności w przypadku usług wspólnych.
Aby uzyskać więcej informacji, zobacz https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html
źródło
DclWrapper
na, aby utworzyć rzeczywistą instancję.ViewContainerRef
zamiast używaćViewChild
, a potem<dcl-wrapper>
sam staje się celem. Elementy są dodawane jako rodzeństwo celu i dlatego będą poza<dcl-wrapper>
tym sposobem.''
(pusty ciąg) `i zmienić konstruktor naconstructor(private target:ViewContainerRef) {}
, a następnie dynamicznie dodawane komponenty stają się rodzeństwem<dcl-wrapper>
Nie jestem wystarczająco fajny do komentowania. Naprawiłem plunker z zaakceptowanej odpowiedzi do pracy dla rc2. Nic szczególnego, linki do CDN były po prostu zepsute.
https://plnkr.co/edit/kVJvI1vkzrLZJeRFsZuv?p=preview
źródło
istnieje komponent gotowy do użycia (kompatybilny z RC5 ) Krok 2-krokowy, który używa
Compiler
do wstrzykiwania komponentu do kontenera krokowego i usługi okablowania wszystkiego razem (synchronizacja danych)źródło