代码之家  ›  专栏  ›  技术社区  ›  Ron

将事件传递给指令并订阅它

  •  0
  • Ron  · 技术社区  · 7 年前

    我有一个输出为eventEmitter的指令。 我想在已发出事件返回订阅的订阅完成后做一些事情。

    (例如,当example.component的save()完成时,我想做console.log(“test”)。-我知道我可以在示例中这样做。组件的save方法,但我正在做一些常规的事情,所以我需要在指令中使用它)。

    import { Directive, OnInit, HostListener, Output, EventEmitter } from '@angular/core';
    
    @Directive({
      selector: '[appSingleActiveButton]'
    })
    export class SingleActiveButtonDirective {
      @Output() appSingleActiveButton: EventEmitter<any> = new EventEmitter();
    
      constructor() {}
    
      @HostListener('click', ['$event'])
      private onClick(e: any): void {
        this.appSingleActiveButton.next(e);
        //determine somehow that the referred function's subscription is completed and do something
        // for example what I tried is: this.appSingleActiveButton.subscribe(() => console.log('do some other stuff'))
      }
    }
    

    我有一个组件,它有一个带有该指令的元素,并传递一个返回订阅的函数。

    示例.component.ts:

    import { Component } from '@angular/core';
    import { Subscription } from 'rxjs/Rx';
    import { Http } from '@angular/http';
    
    @Component({
      selector: 'app-example',
      templateUrl: './example.component.html',
      styleUrls: ['./example.component.scss'],
    })
    export class ExampleComponent {
    
      constructor(private http: Http) {}
    
      public save(index: number): Subscription {
        const requestUrl = 'http://example.com';
        return this.http
        .get(requestUrl)
        .map((response) => response.json()).subscribe(() => console.log(`doing some stuff ${index}`));
      }
    }
    

    示例.component.html

    <div *ngFor="let btn of btns; let i = index">
        <div (appSingleActiveButton)="save(i)">test directive</div>
    </div>
    

    编辑 : 问题如下:

    我怎样才能确定 save() 在我实际调用它的指令内完成(成功或错误) this.appSingleActiveButton.next(e);

    1 回复  |  直到 7 年前
        1
  •  1
  •   Maryannah    7 年前

    根据我以前的回答和你的解释,这次我把你的问题解决了。

    对于您的解决方案,您有几种方法可以满足您的需要。

    1. 给定的指令只做相同的事情(HTTP调用)

    为此,您可以简单地将URL作为参数传递给您的指令,并让direcdtive处理HTTP调用。您可以使用 @Output 检索订阅并在组件中订阅它。

    1. 假设它们做了一些稍微相似的事情,并且希望将逻辑保存到组件中

    你可以通过你的功能 save 直接作为 @Input 按照你的指示。单击后,可以运行此函数,然后再次使用 获取订阅。

    您还可以在构造函数中直接引用元素,然后单击,调用该元素的函数。

    这些是您可以实现的解决方案。如果你需要代码方面的帮助,可以随时要求它,但我不会那样给你,因为我不是你的代码猴子,尝试是最好的学习方法。

    推荐文章