Emit event through nested components in Angular2

前端 未结 3 810
猫巷女王i
猫巷女王i 2021-01-04 14:09

One can use Output() decorator to emit the event from the child component so that the parent component can catch it. What I need is to catch an event emitted by

相关标签:
3条回答
  • 2021-01-04 14:30

    If you find you have to pass certain events through make sure to be consistent and come up with a naming strategy. For instance I like to add raise to the beginning of the method name if the only thing that method does is to re-raise an event.

    eg.

    (paypalTokenized)="raisePaypalTokenized($event)"
    

    and in the ts file:

    @Output('paypalTokenized')
    public paypalTokenizedEmitter = new EventEmitter<PayPalTokenizedPayload>();
    
    // PayPal tokenized
    public raisePaypalTokenized(payload: PayPalTokenizedPayload)
    {
        // no other logic here!
        this.paypalTokenizedEmitter.emit(payload);
    }
    

    This means I can tell immediately that the event is being passed through with no further action.

    0 讨论(0)
  • 2021-01-04 14:33

    the thierry answer is the correct aproach, but if you want to avoid use shared service, you can do somthing like this

    view.html

    <componentA
       (actionA)=actionHandler($event)
    >
    </componentA>
    

    view.ts

    actionHandler(event){
      //doSomething
    }
    

    componentA.html

    <componentB
       (actionB)=actionHandlerA($event)
    >
    </componentB>
    

    componentA.ts

    @Output() actionA: EventEmitter<{}> = new EventEmitter();
    
    constructor() {
    }
    
    actionHandlerA(event){
      this.actionA.emit(event);
    }
    

    componentB.html

    <a (click)="actionHandlerB(...)" >click me</a>
    

    componentB.ts

    @Output() actionB: EventEmitter<{}> = new EventEmitter();
    
    constructor() {
    }
    
    actionHandlerB(o: objectModel){
      this.actionB.emit(new objectModel(o));
    }
    
    0 讨论(0)
  • 2021-01-04 14:38

    There is no support of bubbling for such events. You need to manually catch them and emit to the parent.

    Another approach would be to leverage a shared service for this tree of components and use an observable / subject in it.

    This way all components can subscribe on it to be notified of events even within sub sub children.

    constructor(private service: SharedService) {
      this.service.notifier$.subscribe(
        data => {
          (...)
        });
    }
    

    The event will be triggered this way:

    constructor(private service: SharedService) {
    }
    
    notify() {
      this.service.notifier$.next('some data');
    }
    

    See this link for more details:

    • https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
    0 讨论(0)
提交回复
热议问题