簡體   English   中英

Blazor服務器端問題分享javascript代碼

[英]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 的新手..)
  • 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 僅運行客戶端。 我看不出兩個 windows 會如何共享數據,更不用說兩個用戶了。

幾乎可以肯定,問題在於您正在注入 singleton 服務——這意味着服務器將為所有用戶使用一個實例。

如果是這樣,您有兩個選擇:

(1) 為您的 singleton 服務添加邏輯以合並用戶。 (例如,具有用戶 ID/屬性名稱的字典作為鍵,一列作為值)

(2) go 為Startup.cs並將可疑的 singleton 服務更改為.AddScoped(),這將為每個用戶創建一個新實例。

目前,我認為后一種解決方案將立即解決您的問題。 但是,不要低估 Singleton 的價值——它們對於其他事情會非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM