2016-03-30 2 views
2

Обновлено: Per Thierry Ответ Templier:Могу ли я создавать вложенные угловые компоненты HTML-селекторов?

Ниже приведено то, что я хочу сделать, но, к сожалению, внутренние компоненты не являются рендерингом. Есть ли способ встраивать компоненты через их селектора HTML так?

<custom-menu-bar-component (onCustomEvent)="handleEvent($event)"> 
    <custom-button-component></custom-button-component> 
    <custom-dropdown-component></custom-dropdown-component> 
</custom-menu-bar-component> 

В моем хроме отладчике, я вижу только внешний компонент, оказываемый:

<custom-menu-bar-component> 
    <div class="row"> 
     ** Nothing here, where my two inner components should be :(
    </div> 
</custom-menu-bar-component> 

И мои компоненты выглядеть следующим образом:

CustomMenuBarComponent.ts:

import {Component} from 'angular2/core' 
import {CustomButtonComponent} from './CustomButtonComponent' 
import {CustomDropdownComponent} from './CustomDropdownComponent' 

@Component({ 
    selector: 'custom-menu-bar-component', 
    directives: [CustomButtonComponent, CustomDropdownComponent], 
    template: ` 
     <div class="row"></div> 
    ` 
}) 
export class CustomMenuBarComponent { 
} 

CustomButtonComponent.ts:

import {Component, EventEmitter} from 'angular2/core' 
import {CustomEvent} from './CustomEvent' 

@Component({ 
    selector: 'custom-button-component', 
    outputs: ['onCustomEvent'], 
    template: ` 
     <button type="button" class="btn btn-light-gray" (click)="onItemClick()"> 
     <i class="glyphicon icon-recent_activity dark-green"></i>Button</button> 
    ` 
}) 
export class CustomButtonComponent { 
    onCustomEvent: EventEmitter<CustomEvent> = new EventEmitter(); 
    onItemClick(): void { 
     this.onCustomEvent.emit(new CustomEvent("Button Component Clicked")); 
    } 
} 

CustomDropdownComponent почти идентичен CustomButtonComponent, но с другим текстом. Я просто пытаюсь заставить этот очень простой пример работать, прежде чем я начну делать эти компоненты более полезными и многоразовыми.

Возможно ли такое использование? Я стараюсь, чтобы другим было проще использовать эти компоненты и создавать легко настраиваемые панели меню с легкостью и простотой.

+0

Что вы имеете в виду под «компонентами гнезда через их HTML селекторы? –

+0

После обновления вашего он выглядит как мой ответ остается в силе. –

+0

Аааа, да! Спасибо Гюнтера, я не видел ответ там. – SnoopDougg

ответ

2

Не уверен, что ваш вопрос о том, но

<custom-menu-bar-component (onCustomEvent)="handleEvent($event)"> 
    <custom-button-component></custom-button-component> 
    <custom-dropdown-component></custom-dropdown-component> 
</custom-menu-bar-component> 

требует <ng-content></ng-content> в шаблоне CustomMenuBarComponent

Немного документации можно найти в https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#aftercontent я ожидал немного больше, это было все, что я нашел ,

http://blog.thoughtram.io/angular/2015/06/29/shadow-dom-strategies-in-angular2.html может содержать определенную полезную информацию.

Update

(onCustomEvent)="handleEvent($event)" Перемещение к <custom-button-component></custom-button-component> элемент должен делать то, что вы хотите. События от EventEmitter не пузырятся.

2

На самом деле у вас есть ошибка, потому что вы не создаете экземпляр вашего EventEmitter в CustomButtonComponent компонента:

@Component({ 
    (...) 
}) 
export class CustomButtonComponent { 
    onCustomEvent: EventEmitter<CustomEvent> = new EventEmitter(); // <----- 
    (...) 
} 

В противном случае ваш код кажется правильным.

Update

Вы должны использовать ng-content включить ваши компоненты к югу в CustomMenuBarComponent один.

@Component({ 
    selector: 'custom-menu-bar-component', 
    directives: [CustomButtonComponent, CustomDropdownComponent], 
    template: ` 
    <div class="row"> 
     <ng-content></ng-content> 
    </div> 
    ` 
}) 
export class CustomMenuBarComponent { 
} 
+1

Да, точно Эрик! Я пошел к этой линии, увидел «EventEmitter » и пропустил строку, но не заметил, что новой части «EventEmitter» нет. 'Eagle Eyes - Thierry' ... – micronyks

+1

Оооооо, да, спасибо! Игнорирование моего EventEmitter заставляет меня пройти эту консольную ошибку. К сожалению, внутренние компоненты не отображаются. Я уточню свой вопрос. – SnoopDougg

+1

Я думаю, что вам нужно использовать 'ng-content' для этого. Я обновил свой ответ соответственно ... –

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