[英]Blazor server side problem share javascript code
我正在使用 Blazor 服務器端開發我的項目。 在我開發時,我使用 javascript 代碼來實現 C# 難以實現的東西。
但是,我面臨着一些奇怪的情況。 (我想這是javascript的問題)
假設有 2 個用戶(A,B)。 當“A”用戶執行一些調用 javascript 代碼的操作時,如果“B”用戶進入同一頁面,“A”用戶操作會影響“B”用戶。
我用threejs實現了具有3d場景的web頁面。 如上所述,當用戶“A”使用鼠標事件(mousemove,mousedown..)移動一些 object 時,如果用戶“B”訪問同一頁面,則 B 的 3d 對象將移動到用戶“A”移動的位置。 原來,當用戶訪問我開發的web頁面時,3d對象的position應該是0,0,0。
我猜
我猜 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 僅運行客戶端。 我看不出兩個 windows 會如何共享數據,更不用說兩個用戶了。
幾乎可以肯定,問題在於您正在注入 singleton 服務——這意味着服務器將為所有用戶使用一個實例。
如果是這樣,您有兩個選擇:
(1) 為您的 singleton 服務添加邏輯以合並用戶。 (例如,具有用戶 ID/屬性名稱的字典作為鍵,一列作為值)
(2) go 為Startup.cs
並將可疑的 singleton 服務更改為.AddScoped(),這將為每個用戶創建一個新實例。
目前,我認為后一種解決方案將立即解決您的問題。 但是,不要低估 Singleton 的價值——它們對於其他事情會非常有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.