当前位置: 首页 > 知识库问答 >
问题:

使用EventEmitter将按钮单击转换为RXJS observable

范翰海
2023-03-14

以下是组件与EventEmitter的工作方式:

import { Component, Output, EventEmitter } from "@angular/core";

@Component({
  selector: "app-my-component",
  template: ` <button (click)="clickEvent($event)">Foo</button> `
})
export class MyComponent {
  @Output()
  onClick: EventEmitter<string> = new EventEmitter<string>();

  clickEvent(): void {
    this.onClick.emit("something that comes from my.component.ts");
  }
}

@Component({
  selector: "app-root",
  template: `
    <h1>Title inside app component.</h1>
    <app-my-component (onClick)="doSomething($event)"></app-my-component>
  `
})
export class AppComponent {
  doSomething(foo) {
    console.log(foo);
  }
}

如何对RXJS可观测对象执行相同的操作?

我正在尝试以下方法:

import {
  Component,
  ElementRef,
  ViewChild,
  AfterViewInit,
  Output
} from "@angular/core";
import { Observable, fromEvent } from "rxjs";
import { tap } from "rxjs/operators";

@Component({
  selector: "app-my-component",
  template: ` <button #btn>Foo</button> `
})
export class MyComponent implements AfterViewInit {
  @Output()
  onClick: Observable<string>;

  @ViewChild("btn", { static: true }) buttonRef: ElementRef<HTMLButtonElement>;

  foo$: Observable<?>;

  ngAfterViewInit() {
    this.foo$ = fromEvent(this.buttonRef.nativeElement, "click").pipe(
      tap((e) => e.stopPropagation())
    );
  }

  // what should be returned here?
  onClick(): Observable<?> {
   return this.foo$
  }
}

@Component({
  selector: "app-root",
  template: `
    <h1>Title inside app component.</h1>
    <app-my-component (onClick)="doSomething(event$)"></app-my-component>
  `
})
export class AppComponent {
  doSomething(foo) {
    console.log(foo);
  }
}

或者你不应该在按钮上使用RXJS点击事件?

阅读了很多很老的博客文章,所以我没有找到一个完整的按钮点击事件的例子。任何指向正确方向的指针和工作示例都将真正有助于理解概念。

共有1个答案

郏景澄
2023-03-14

我在angular中从未见过这样的按钮点击方法,而且您已经在使用RxJS和EventEmitter:)

看看https://angular.io/api/core/EventEmitter

EventEmitter扩展了Subject,所以如果您想直接使用RxJS,请尝试使用它。您可以检查这个答案Angular-Rxjs Observable-Clicking事件实现,并给出一个很好的解释

此外,使用本机元素不受角度限制

 类似资料:
  • 下面是一个jquery教程,该教程使用标准的href文本链接进行初始化。我把一切都搞定了。作为最后一步,我想移除文本链接,并用一个使用其click事件的按钮替换它。这里是我的代码,它现在存在: 所以,我设置了一个非常简单的按钮,但是我不知道要在onclick事件处理程序中放什么。如果这是一个简单的URL链接,没有问题。我将只编写一个jquery函数(甚至只编写一个js函数)。但在这段代码的上下文中

  • 我正在尝试用selenium WebDriver单击一个按钮。但无法识别按钮。这是我的代码:它返回一条错误消息 NoSuchelementException:消息:u'没有这样的元素:找不到元素:{“method”:“XPath”,“Selector”:“//*[@id=”ArtifactContentList“]/div[2]/div/div[3]/content-dataset-actions

  • 我想单击以下按钮: https://i.stack.imgur.com/ifiDC.png 到目前为止,我的代码看起来像这样,但什么也没发生: https://i.stack.imgur.com/Cgi5v.png 谢谢你的帮助:)

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 我正试图抓取一个页面,获取一盘国际象棋的移动列表,该列表位于右侧菜单的“移动”选项卡下。 在浏览器中手动单击“移动”选项卡时,我可以通过 哪个(正确地)返回 当尝试通过单击按钮时,使用 似乎什么都没有发生,我不知道如何进行故障排除。 如何通过模拟单击(活动事件侦听器)切换到“移动”选项卡? 额外提示:是否可以使用rvest软件包?

  • 问题内容: 我正在尝试在www.meetme.com上发送消息,但不知道该怎么做。我可以在评论区域中键入消息,但是单击“发送”按钮不会执行任何操作。我究竟做错了什么?当我登录并按登录按钮时,页面确实发生了变化,一切都很好。有人有任何想法或线索吗? 问题答案: 如果不了解正在访问的网页,就无法在禁用JavaScript的情况下执行AJAX请求。如果更改未成功,则必须继续进行调试,但请确保已启用Jav