Blazor服务器-我想使用键盘键来控制屏幕.

1.我将dotNetReference传递给我的javascript函数.

    protected async override Task OnAfterRenderAsync(bool firstRender)
    {
        
        var dotNetReference = DotNetObjectReference.Create(this);
        await JSRuntime.InvokeVoidAsync("JsFunctions.addKeyboardListenerEvent", dotNetReference);

    }
  1. 我运行该脚本并返回对razor Page的调用.

当它是匿名函数时,无论KeyUp发生多少次,它都会重复调用.当定义了带有EventListener的函数调用时,我丢失了dotNetReference,但它正确地运行了一次!

  1. 我已经很接近了,但我想不出如何持久化dotNetReference以便它可以调用C#方法

匿名

    addKeyboardListener: function (dotNetReference) {
        

        document.addEventListener('keyup', function(event) {
            /*document.removeEventListener('keyup');*/
            if (event.key == 7) {
                dotNetReference.invokeMethodAsync('Prev');
            }
            if (event.key == 8) {
                dotNetReference.invokeMethodAsync('Next');
            }
            if (event.key == 3) {
                dotNetReference.invokeMethodAsync('NavigateToOverviewPage');
            }
        });

已定义 AddKeyboardListener:函数(DotNetReference){

    document.addEventListener('keyup', myFunction) 


    function myFunction(event) {

        // Calls a method by name with the [JSInokable] attribute (above)
        var dotNetReference = dotNetReference
        if (event.key == 7) {
            dotNetReference.invokeMethodAsync('Prev');
        }
        if (event.key == 8) {
            dotNetReference.invokeMethodAsync('Next');
        }
        if (event.key == 3) {
            dotNetReference.invokeMethodAsync('NavigateToOverviewPage');
        }
    }

}
C#
[JSInvokable]
public  void Next()
{
    ClearMessages();
}

必须有一种方法来持久化dotNetReference,但我想不出来,而且肯定缺少一种明显的方法来实现这一点.谢谢.

推荐答案

嗯,多亏了这个链接,我才能让它工作:parameters

  1. 保留这一点:
    protected async override Task OnAfterRenderAsync(bool firstRender)
    {
        
        var dotNetReference = DotNetObjectReference.Create(this);
        await JSRuntime.InvokeVoidAsync("JsFunctions.addKeyboardListenerEvent", dotNetReference);
    
    }
  1. 将dotNetReference存储为您向其中添加EventListener的对象的属性(在我的示例文档中):
    def: function test(dotNetReference) {
        document.dotNetRef = dotNetReference;
        document.addEventListener('keyup', abc)
    }
  1. ABC现在可以访问dotNetReference:
    abc: function myFunction1(e) {
        dn = e.currentTarget.dotNetRef;
        // Calls a method by name with the [JSInokable] attribute (above)
    
        if (e.key == 7) {
            dn.invokeMethodAsync('Prev');
        }
        if (e.key == 8) {
            dn.invokeMethodAsync('Next');
        }
        if (e.key == 3) {
            dn.invokeMethodAsync('NavigateToOverviewPage');
        }
    
    }

Javascript相关问答推荐

主要内部的ExtJS多个子应用程序

使用redux-toolet DelivercThunks刷新访问令牌

Next.js Next/Image图像隐含性有任何类型-如何修复?

MongoDB中的引用

如何找出摆线表面上y与x相交的地方?

使搜索栏更改语言

如何在mongoose中链接两个模型?

将现场录音发送到后端

构造HTML表单以使用表单数据创建对象数组

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

为什么客户端没有收到来自服务器的响应消息?

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

如何确保预订系统跨不同时区的日期时间处理一致?

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

Plotly.js栏为x轴栏添加辅助文本

使用静态函数保存 node 前的钩子

将字符串解释为数字;将其重新编码为另一个基数

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

如何从图表中映射一组图表-js使用REACT