【问题标题】:How to execute Angular function from Javascript function?如何从 Javascript 函数执行 Angular 函数?
【发布时间】:2023-08-29 18:39:02
【问题描述】:

对于我的 Web 应用,我创建了一个 html5 画布并创建了允许我通过 mousedown、mouseup 和 mousemove 在此画布上绘图的函数:

<canvas 
    #canvas id="canvas" 
    (mousemove)="mouseMove($event)" 
    (mousedown)="mouseDown()" 
    (mouseup)="mouseUp()">
</canvas>

经过测试,我意识到这不适用于触摸屏,我需要这样的触摸事件:

document.getElementById('canvas').addEventListener('touchstart', function(event) {

})

但是我不想重做 Javascript 中的所有代码,而是仍然使用我的 Angular 函数。在这个例子中,我如何从 javascript 函数中执行 mousedown 函数:

export class PenInputComponent implements AfterViewInit {

    public ngAfterViewInit(): void {
        document.getElementById('canvas').addEventListener('touchstart', function(event) {

            // execute mousdeDown function here
        })
    }

    public mouseDown(): void {
        this.startDrawState();
    }
}

我怎样才能做到这一点,甚至有可能吗?

更新:解决方案如下:

document.getElementById('canvas').addEventListener('touchstart', (event) => {
    this.mouseX = event.targetTouches[0].pageX;
})

由于可能有多个触摸事件,它是一个数组,必须相应地获取坐标,但对于 angular,您应该将其放入 canvas 标记中,如下所述。

【问题讨论】:

  • 你可以使用touchStart事件吗?你有触摸事件。
  • 请注意,您实际上并不需要方法的 public 关键字;默认情况下它应该是公开的。
  • @Edric 之所以称为 typescript 是有原因的,所以我尽我所能打字,让我的编码风格看起来更统一
  • @Miger 你能改写你的评论吗?我不明白。
  • @Miger 之所以称为 TypeScript,是因为它有 types。 public 不是一种类型,它是一个访问修饰符。或者你认为它被称为 TypeScript 是因为你必须输入比 JS 更多的输入?大声笑

标签: javascript html angular


【解决方案1】:

(您可以在 Angular 模板中监听任何原生 HTML 事件,而不仅仅是鼠标点击)

您可以使用pointer events:

<canvas #canvas id="canvas" 
   (pointermove)="mouseMove($event)" 
   (pointerdown)="mouseDown()" 
   (pointerup)="mouseUp()"></canvas>

这在 Safari 中不受支持。如果您真的需要 Safari 支持,您应该使用 (touchstart) 等...

总而言之,这是打字稿材料的基本角度。我建议你阅读这两个主题。好的起点是 angular.io 网站。

要真正回答您的问题,您可以在函数中使用 this.mouseDown,但话又说回来,不要在 Angular 应用程序中使用 getElementByIdaddEventListener。所以真的..不要在这里使用代码:

public ngAfterViewInit(): void {
  document.getElementById('canvas').addEventListener('touchstart', (event) => {
    this.mouseDown();
  })
}

public mouseDown(): void {
  this.startDrawState();
}

【讨论】:

  • 谢谢!那些是什么,“指针”应该代表什么?
  • 我不明白你的答案.. 在 JavaScript 函数中使用 this.mouseDown() 不起作用,因为它无法从 Angular 应用程序中访问该函数.. 我可以使用 touchstart。 . Angular 有点令人困惑,因为智能感知不会建议类似 touchstart 或有时类似的东西.. 在某个地方我读到这些 touchevent 无论如何都被贬低了,我们应该改用 HammerJS.. 我真的不明白吗??
  • @Miger 我已经更新了我的答案。没有意识到您使用的是 function 关键字。不要那样做,你会失去this 上下文。始终使用箭头符号。但是,仍然只使用模板事件绑定,如果需要,您可以使用hammerjs,模板保持不变。 Hammerjs 仅用于手势
  • 感谢您的信息!有没有一种简单的方法来测试触摸输入是否真的有效?我不可能在触摸屏设备上进行测试,因为我没有这样做的授权。当我使用谷歌浏览器的开发模式时,交互仍然不会绘制到画布上,而是滚动窗口..
  • @Miger chrome devtools 与移动仿真是应该工作的方式。如果这不起作用,这很奇怪,你做了一个 boo-boo :)。或者你可以尝试在pointerdown/touchstart监听器中添加event.preventDefault()