微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rxjs:对 Typescript

如何解决Rxjs:对 Typescript

我正在用 RxJS 和 Angular 玩一个可拖动矩形的例子,但我不明白为什么在 Typescript 的情况下鼠标响应比 Angular 更好。 *注意:我认为问题在于 Angular 让我在矩形外执行 MouseUp 而这不会发生在 Typescript

一定是我遗漏了什么。还有什么我应该考虑的吗?

我试图在互联网上查找它,我刚刚找到了如何使用 cdk 库或更复杂的 rxjs 运算符来完成它。我的第一个意图是将它构建得像现在一样简单。有什么想法吗?

这里是我的例子:

我把每个代码代码在这里,以防有人喜欢:

打字稿示例:

draggable: HTMLElement;

let draggable = <HTMLElement>document.querySelector("#draggable");

let mouseDown$ = fromEvent<MouseEvent>(draggable,"mousedown");
let mouseMove$ = fromEvent<MouseEvent>(document,"mousemove");
let mouseUp$ = fromEvent<MouseEvent>(document,"mouseup");

mouseDown$.subscribe(() => {
  mouseMove$
    .pipe(
      map(event => {
        event.preventDefault();
        return {
          x: event.clientX,y: event.clientY
        };
      }),tap(console.log),takeuntil(mouseUp$)
    )
    .subscribe(pos => {
      // Draggable is absolutely positioned
      draggable.style.left = pos.x + "px";
      draggable.style.top = pos.y + "px";
    });
});

角度示例:

export class AppComponent implements AfterViewInit,OnInit {
  draggable: HTMLElement;
  mouseDown$: Observable<MouseEvent>;
  mouseMove$: Observable<MouseEvent>;
  mouseUp$: Observable<MouseEvent>;


  ngOnInit() {
    this.draggable = <HTMLElement>document.getElementById("draggable");
    this.mouseDown$ = fromEvent<MouseEvent>(this.draggable,"mousedown");
    this.mouseMove$ = fromEvent<MouseEvent>(this.draggable,"mousemove");
    this.mouseUp$ = fromEvent<MouseEvent>(this.draggable,"mouseup");
  }

  ngAfterViewInit() {
    this.mouseDown$.subscribe(() => {
      this.mouseMove$
        .pipe(
          map(event => {
            event.preventDefault();
            return {
              x: event.clientX,y: event.clientY
            };
          }),takeuntil(this.mouseUp$)
        )
        .subscribe(pos => {
          this.draggable.style.left = pos.x + "px";
          this.draggable.style.top = pos.y + "px";
        });
    });
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。