我有以下代碼:
@page "somePage"
<TeamsApplication RequireAuthentication="true">
<ApplicationTemplate Context="context">
Some HTML...
@*context works here*@
</ApplicationTemplate>
</TeamsApplication>
@code{
//context doesnt work here
}
在 ApplicationTemplate 標記中,我可以訪問背景關系物件實體,但不能在代碼部分中訪問。有沒有辦法可以訪問該實體及其值?
uj5u.com熱心網友回復:
一個熟悉的問題,從一組想要共享資料和狀態的組件構建一個頁面。您可以將它們全部連接在一起,但很快就會得到意大利面。
解決方案是將您的資料和狀態與 UI 分開。UI 代碼位于組件中,資料和狀態位于服務中 - 通常稱為 ViewService。該服務通常是有范圍的,即每個 SPA 會話一個。每個組件注入服務,然后訪問共享資料/狀態。您使用服務中的事件來通知組件需要對其做出反應的更改 - 通常是重新渲染。
在您的問題中,該服務將保留context. 然后TeamsApplication,ApplicationTemplate,SomePage和任何其他部分將全部注入服務和訪問context。
如果你想要一個有效的例子,問,我會在這個答案中添加一個。
uj5u.com熱心網友回復:
屬性通常向下流動,而不是向上流動。所以這個Context屬性不會像那樣作業。我能想到的最簡單的解決方案是 EventCallback,以便ApplicationTemplate向父級發送一條訊息,表明 Context 可用
ApplicationTemplate.razor
[Parameter] public EventCallback<Context> ContextChanged { get; set; }
/// <summary>
/// Context was set from somewhere
/// </summary>
async Task ContextSet(Context newValue)
{
// notify anyone listening to ContextChanged
await ContextChanged.InvokeAsync(newValue);
}
然后在您的頁面邏輯中,您會收聽此事件回呼:
<TeamsApplication>
<ApplicationTemplate ContextChanged=HandleContextChanged>
@* todo *@
</ApplicationTemplate>
</TeamsApplication>
@code
{
/// <summary>
/// Handle event from ApplicationTemplate
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
async Task HandleContextChanged(Context context)
{
// context is now available
}
}
uj5u.com熱心網友回復:
您可以創建一個函式,該函式接受與您的背景關系型別相同型別的引數,因此您可以訪問該函式,但問題是:您需要該背景關系做什么?
如果您需要創建一個需要訪問該背景關系的自定義組件,請將其傳遞給另一個子組件,然后創建一個 RenderFragment 型別的 [Parameter],以便您可以根據需要處理它。
你甚至可以創建一個本地函式來渲染一個 RenderFragment 但是這種東西的 Razor 語法非常笨拙而且有點問題
例如我有一個這樣的方法
public RenderFragment DefaultActionTemplate(PanelAction action) =>@:@{
if (action.IsToggle) {
<div>Toggle</div>
}
else {
<div>Button</div>
}
}
;
你可以做同樣的事情并使用你的背景關系型別而不是我的 PanelAction,概念是一樣的
正如我告訴過你的那樣,語法很尷尬,你在最后看到的分號需要在一個新行上,不能在下一個關閉的卷曲剎車看到這個問題:https : //github.com/dotnet/ aspnetcore/問題/11612
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337105.html
