2016-05-03 2 views
7

Родителя шаблон:Как пузыриться angular2 пользовательское событием

<ul> 
    <tree-item [model]="tree" (addChild)="addChild($event)"></tree-item> 
</ul> 

дерево шаблон элемента:

<li> 
    <div>{{model.name}} 
    <span [hidden]="!isFolder" (click)="addChild.emit(model)">Add Child</span> 
    </div> 
    <ul *ngFor="let m of model.children"> 
    <tree-item [model]="m"></tree-item> 
    </ul> 
</li> 

Для приведенного выше примера, родитель получает AddChild события только от корня дерева пункта (непосредственный ребенок) , Можно ли пузырить событие addChild из любого дерева? Я использую угловой 2.0.0-rc.0.

ответ

11

События от EventEmitter не поддерживают пузыри.

Вы можете использовать element.dispatchEvent() для запуска события DOM, которое пузырится, или использовать общую службу, такую ​​как шина сообщений.

Смотрите также https://angular.io/docs/ts/latest/cookbook/component-communication.html

+0

Может ли объект JavaScript CustomEvent использовать? Есть ли против этого профессионал? В документах «Угловая» это не распространяется. Может быть, потому, что они не советуют напрямую обращаться к DOM. – Ryan

+0

Для этого используется 'element.dispatchEvent()'. Угловое предлагает использовать общую службу вместо DOM-событий. Событие DOM может вызвать обнаружение изменений для всего приложения, в то время как служба с наблюдаемым только вызывает обнаружение изменений для компонента, который подписывается на наблюдаемый. –

+0

@ GünterZöchbauer давайте предположим, что у нас есть приложение, где правый щелчок на якорях определенного класса/селектора должен отображать настраиваемое контекстное меню. В jQuery у нас было бы что-то вроде '$ ('body'). On ('contextmenu', 'a.context', myFunction)' Я бы скорее привязал событие к телу, а не к тегу. Вы говорите, что такой подход невозможен в Angular2? – igasparetto