javascript - Blazor 服务器端问题分享 javascript 代码
问题描述
我正在使用 Blazor 服务器端开发我的项目。在我开发时,我使用 javascript 代码来实现 C# 难以实现的东西。
但是,我面临着一些奇怪的情况。(我想这是javascript的问题)
假设有 2 个用户(A,B)。当“A”用户执行一些调用 javascript 代码的操作时,如果“B”用户进入同一页面,“A”用户的操作会影响“B”用户。
我用threejs实现了具有3d场景的网页。正如我上面解释的,当用户“A”使用鼠标事件(mousemove,mousedown..)移动某个对象时,如果用户“B”访问同一页面,则 B 的 3d 对象将移动到用户“A”移动的位置。最初,当用户访问我开发的网页时,3d 对象的位置应该是 0,0,0。
我猜
- 我不使用原型或类(全局使用变量和函数。我是 javascript 新手..)
- Javascript 在服务器端运行(共享资源??,如果这样,我该如何解决)
我猜javascript会有问题,但如果您有任何其他意见,请分享一下吗?
已编辑
我已经解决了这个问题DotNetObjectReference.Create(this);
C#
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
//send created instance to javascript
var dotNetObjRef = DotNetObjectReference.Create(this);
await JSRuntime.InvokeVoidAsync("SetObjectRef", dotNetObjRef);
}
await base.OnAfterRenderAsync(firstRender);
}
[JSInvokable]
public async Task enableSomething(bool bEnable)
{
var something = bEnable;
}
//== before edit
//[JSInvokable]
//public static async Task enableSomethingStatic(bool bEnable)
//{
// var something = bEnable;
//}
Javascript
var objectRef;
function SetObjectRef(ref) {
objectRef = ref;
}
//call c# function
objectRef.invokeMethodAsync("enableSomething", true);
正如我猜测的那样,这是“静态”方法的问题。如果您将从 javascript 调用的 C# 方法声明为“静态”并且此方法更改了 UI 变量的某些内容,则此方法可能会影响其他用户。
所以我创建当前页面的实例并将其发送给 javascript,当我需要从 javascript 调用 C# 方法时,我使用创建的实例调用方法。
有什么问题或问题,请分享。对不起,我的英语不好。
解决方案
JavaScript 仅在客户端运行。我看不到两个窗口,更不用说两个用户,将如何共享数据。
几乎可以肯定,问题在于您正在注入一个单例服务——这意味着服务器将为所有用户使用一个实例。
如果是这样,您有两个选择:
(1) 为您的单例服务添加逻辑以合并用户。(例如,具有用户 ID/属性名称的字典作为键,一列作为值)
(2)Startup.cs
将可疑单例服务更改为 .AddScoped(),这将为每个用户创建一个新实例。
目前,我认为后一种解决方案将立即解决您的问题。但是,不要低估 Singleton 的价值——它们对于其他事情会非常有用。
推荐阅读
- selenium - Selenium WebDriver 中的列表框向上或向下滚动
- javascript - 显示来自 Swapi API 但接收 [object Promise] 的电影
- javascript - 按作为字符串日期的键对对象键值对进行排序
- javascript - 我有一个带有图标和文本的按钮,我尝试将它们分组,这样图标就不能单独点击
- vue.js - Vue/Vuex 保留以前用户的数据
- flutter - TextFormField 中的 Hinttext 未与前缀和后缀图标对齐
- python - 如何将pandas datfarme中列中的整数值映射到随机n位数字?
- mysql - mysql - 仅将条件应用于不总结整个查询
- python - 给定一组约束的分配问题
- google-chrome - 如何在 Manifest_version 3 Chrome 扩展中将内容复制到剪贴板?