Blazor/Blazorise.Bootstrap html 元素在使用组件的多个实例时正在交互
Blazor/Blazorise.Bootstrap html elements are interacting when using multiple instances of a component
在我的 blazor 应用程序中,我有一个组件,它有一个按钮和一个由按钮控制的 bootstrap 折叠。当我只在一个页面上使用该组件一次时,一切正常,但如果我在一个页面上多次使用它,那么一个按钮也会触发另一个的折叠元素,因为它们的 ID 似乎是静态的。有解决办法吗?
这是组件的代码
<button class="btn btn-primary form-control" type="button" data-toggle="collapse" data-target="#divCollapse" aria-expanded="false" aria-controls="divCollapse">
@Technician.Name
</button>
<div class="collapse" id="divCollapse">
<div class="card card-body">
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Assigned To</th>
</tr>
</thead>
<tbody>
@foreach (var task in _repo.GetTasksByTechnician(Technician).ToList())
{
<tr>
<td>@task.Id</td>
<td>@task.AssignedTo</td>
</tr>
}
</tbody>
</table>
</div>
</div>
@code {
[Parameter]
public Technician Technician { get; set; }
}
这是我用来创建组件的页面中的代码:
@foreach (var tech in _technicians)
{
<PersonComponent Technician="@tech"></PersonComponent>
}
您必须为您的组件可折叠部分分配一个唯一 ID。现在你在页面上以许多具有相同 id 的 html 元素结束,这在语法上是不正确的,这就是为什么 Bootstrap 无法完成它的工作。
所以你可以尝试这样做:
<button class="btn btn-primary form-control" type="button" data-toggle="collapse"
data-target="#divCollapse@(Technician.Id)" aria-expanded="false" aria-controls="#divCollapse@(Technician.Id)">
@Technician.Name
</button>
<div class="collapse" id="divCollapse@(Technician.Id)">
etc...
如果每个技术人员都应该有一个 Id,或者只是放置任何 属性 来唯一标识他们中的每个人,并且可以附加到“#divCollapse”字符串以创建一个结构良好的字符串,那么这将起作用id(除下划线或连字符外没有空格或标点符号)。
如果技术人员实体没有合适的属性,只需在组件中定义另一个参数并从外部注入:
@for (int idx = 0; idx < _technicians.Length; idx++)
{
int capturedIdx = idx; // <- Necessary to get the loop variable to the context
<PersonComponent Technician="@tech" Identifier="@capturedIdx"></PersonComponent>
}
当然在你的组件中:
[Parameter]
public int Identifier { get; set; }
然后您可以使用它附加到“divCollapse”id。
希望对您有所帮助!
在我的 blazor 应用程序中,我有一个组件,它有一个按钮和一个由按钮控制的 bootstrap 折叠。当我只在一个页面上使用该组件一次时,一切正常,但如果我在一个页面上多次使用它,那么一个按钮也会触发另一个的折叠元素,因为它们的 ID 似乎是静态的。有解决办法吗?
这是组件的代码
<button class="btn btn-primary form-control" type="button" data-toggle="collapse" data-target="#divCollapse" aria-expanded="false" aria-controls="divCollapse">
@Technician.Name
</button>
<div class="collapse" id="divCollapse">
<div class="card card-body">
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Assigned To</th>
</tr>
</thead>
<tbody>
@foreach (var task in _repo.GetTasksByTechnician(Technician).ToList())
{
<tr>
<td>@task.Id</td>
<td>@task.AssignedTo</td>
</tr>
}
</tbody>
</table>
</div>
</div>
@code {
[Parameter]
public Technician Technician { get; set; }
}
这是我用来创建组件的页面中的代码:
@foreach (var tech in _technicians)
{
<PersonComponent Technician="@tech"></PersonComponent>
}
您必须为您的组件可折叠部分分配一个唯一 ID。现在你在页面上以许多具有相同 id 的 html 元素结束,这在语法上是不正确的,这就是为什么 Bootstrap 无法完成它的工作。
所以你可以尝试这样做:
<button class="btn btn-primary form-control" type="button" data-toggle="collapse"
data-target="#divCollapse@(Technician.Id)" aria-expanded="false" aria-controls="#divCollapse@(Technician.Id)">
@Technician.Name
</button>
<div class="collapse" id="divCollapse@(Technician.Id)">
etc...
如果每个技术人员都应该有一个 Id,或者只是放置任何 属性 来唯一标识他们中的每个人,并且可以附加到“#divCollapse”字符串以创建一个结构良好的字符串,那么这将起作用id(除下划线或连字符外没有空格或标点符号)。
如果技术人员实体没有合适的属性,只需在组件中定义另一个参数并从外部注入:
@for (int idx = 0; idx < _technicians.Length; idx++)
{
int capturedIdx = idx; // <- Necessary to get the loop variable to the context
<PersonComponent Technician="@tech" Identifier="@capturedIdx"></PersonComponent>
}
当然在你的组件中:
[Parameter]
public int Identifier { get; set; }
然后您可以使用它附加到“divCollapse”id。
希望对您有所帮助!