【问题标题】:Angular 7 disabled status according to click event根据点击事件的Angular 7禁用状态
【发布时间】:2019-05-18 21:09:18
【问题描述】:

在 Typescript 3.1.1 中使用 Angular 7

目标

我希望能够添加在上一个点击事件完成(成功与否)之前无法再次触发的点击事件。

示例

<div>
    <span *ngFor="let a of [1,2,3,4,5,6]" (asyncClick)="onClick(a)">
    </span>
</div>

asyncClick 正在替换clickasyncClick 接收 Promise&lt;any&gt; 并在其上使用 .then。 在等待then 触发时,该按钮应处于禁用模式。

我的问题

由于 asyncClick 可以附加到 div、span、button、input、a、img 甚至是组件 ..,我不想为每种类型创建一个组件来处理这个,因为它只是不是动态的全部。

到目前为止我做了什么

使用

创建一个监听点击事件的指令
@HostListener('click', ['$event'])

但我不知道如何获得点击事件承诺。它看起来像&lt;div asyncClick (asyncClick)="myOnClick()"&gt;&lt;/div&gt;,但显然,当myOnClick 被解雇时,我没有等待的承诺。

myOnClick (num: number): Promise<any> {
    return Promise.resolve();
}

【问题讨论】:

  • 创建一个执行它的指令。您必须接受asyncClickable (asyncClick)="...",因为您不能将输出绑定用作选择器,也不应始终将点击处理程序附加到所有元素。
  • @IngoBürk 查看编辑

标签: angular typescript angular7


【解决方案1】:

您可以使用 Observable 'Subject' 来实现它。

服务:

@Injectable({providedIn: 'root'})
export class asyncService {

   getUserData(){
     return from(this.http.get());
   }
}

指令:

  @Output() debounceClick = new EventEmitter();
  private clicks = new Subject();

  constructor() { }

  ngOnInit() {
    this.clicks.pipe(
      debounceTime(500),
      asyncService.getUserData()
    ).subscribe(e => this.debounceClick.emit(e));
  }

  @HostListener('click', ['$event'])
  clickEvent(event) {
    event.preventDefault();
    event.stopPropagation();
    this.clicks.next(event);
  }

参考:https://coryrylan.com/blog/creating-a-custom-debounce-click-directive-in-angular

【讨论】:

  • 它不只是防止在 500 毫秒的空间中双击吗?我真的想等待承诺..
  • 因为我们正在使用支持链接操作的可观察管道运算符。更新的答案。
  • 但是.. 这不是我想要做的。 myOnClick 是一个返回承诺的函数,我希望元素和点击事件将被禁用,直到承诺被解决或拒绝
  • 您假设您知道方法“asyncService.getUserData()”.. 这取决于 onMyClick 承诺。它不像指令每次都使用一个方法。我认为您在这里真的误解了我的问题。指令不知道它要触发什么函数,它只知道该函数返回一个指令需要等待的承诺。
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多