我在 blazor 服务器端应用程序中使用 BlazoredTypeahead 组件,我想知道 @context 关键字来自哪里。
以下代码运行正常,但 VS 报告它无法解析符号“上下文”。当然,我很好奇它为什么有效以及上下文来自哪里。
@inject IEquipmentService EquipmentService
@inject AppDataService AppDataService
<h3>ModelSelect</h3>
<BlazoredTypeahead SearchMethod="SearchModels"
@bind-Value="equipModel">
<SelectedTemplate>
@context.model
</SelectedTemplate>
<ResultTemplate>
@context.model (@context.model_desc)
</ResultTemplate>
</BlazoredTypeahead>
@if (equipModel != null)
{
<p>Selected model is: @equipModel.model</p>
}
@code {
private EquipModel equipModel;
private async Task<IEnumerable<EquipModel>> SearchModels(string searchText)
{
var result = await EquipmentService.SearchModels(AppDataService.CurrentContact, searchText);
return await Task.FromResult(result.ToList());
}
}
Run Code Online (Sandbox Code Playgroud)
Isa*_*aac 10
当您在组件中定义 RenderFragment 属性时,您实际上定义了一个委托,该委托封装了具有 T 类型的单个参数的方法,例如:
RenderFragment<TItem> RowTemplate
Run Code Online (Sandbox Code Playgroud)
当您像这样执行委托时:
@foreach (var item in Items)
{
<tr>@RowTemplate(item)</tr>
}
Run Code Online (Sandbox Code Playgroud)
您为项目列表中的每个项目调用委托,向委托传递一个项目对象,例如 Pet 对象(请注意,此处委托的类型说明符是通用的。@context是 Blazor 提供的内部变量,其中包含传递给委托的值,例如:
<RowTemplate>
<td>@context.ID</td>
<td>@context.Name</td>
</RowTemplate>
Run Code Online (Sandbox Code Playgroud)
注意:RowTemplate 元素的开头和结尾内的内容表示由 RowTemplate RenderFragment 委托生成的内容片段...再次生成内容时,您将获取传递给委托的值并使用它。如果该值是 Pet 对象,例如具有两个字段,则可以使用 @context.Name 等表达式访问字段的值。
请注意,有一种方法可以使用传递的对象的类型名称而不是使用 @context,但这是另一个故事了。
但 VS 报告它无法解析符号“上下文”
这是一个警告,对吧?我没有检查你的代码,但在我看来,使用的类型说明符是泛型类型,而 VS 无法解析底层类型。在我的示例中,类型说明符是 TItem,但传递给属性的项目列表的类型RenderFragment<TItem> RowTemplate
是 Pet 类型。
据我记得,以前泛型类型存在问题,您必须将基础类型传递给模板化组件...您必须像这样编写代码:
模板化组件的使用:
RenderFragment<TItem> RowTemplate
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们分配了一个名为"pets"
Items 属性的 Pet 对象列表,但我们还必须指定在列表 ( ) 中传递的对象的类型TItem="Pet"
。据我所知这个问题已经解决了,也许 BlazoredTypeahead 的代码是以前写过的?
归档时间: |
|
查看次数: |
9159 次 |
最近记录: |