我的组件中有一个名为ClearFiles(字符串PathName(的方法,我目前通过单击组件上的一个按钮来调用它,但现在我试图同时调用它们,但我不知道如何做到这一点。从组件中调用单个ClearFiles方法效果很好,但我不太确定如何使用父类同时调用所有这些方法。我在父类中制作了一个名为ForceClean的按钮,我希望可以按下它来调用所有组件的clear files函数。
我在PageFileCleaner.rarzor文件中使用for循环在父类中创建组件,如下所示:
@foreach (var d in filters)
{
<CompFileFilter FileFilter="d" OnDelete="Delete" ></CompFileFilter>
}
其中filters是位于命名空间Common中的FileFilter类型的列表。数据库。这就是它在父类中声明的方式:
private List<FileFilter> filters { get; set; }
并使用从我的数据库中填充数据
using var context = _db.CreateDbContext();
filters = await context.FileFilters.AsNoTracking().ToListAsync();
foreach( var filter in filters)
{
FileFilter f = new FileFilter();
}
这个Parameter(在子类中(是我使用FileFilter从数据库中的那一行获取值的参数。路径名或文件过滤器。例如ID:
[Parameter]
public FileFilter FileFilter { get; set; }
数据库/FileFilter对象类:
namespace Common.DB
{
public class FileFilter
{
[Key]
public int ID { get; set; }
public string TimerChoice { get; set; }
public bool IsLoading;
public string PathName { get; set; } = "";
public string Extension { get; set; }
//public string[] extensionList { get; set; }
...
}
}
clear files函数在我的组件/子CompFileFilter.razor文件中(因为它有一百多行代码,所以去掉了这个例子的代码(。我正在父类中创建组件,每个组件都有这个ClearFiles((方法。
public async Task ClearFiles(string PathName)
{
filtering code...
}
如何从父类循环遍历组件并调用所有ClearFiles((方法?
您可以使用字典并存储每个CompFileFilter
组件的引用。然后使用引用来调用ClearFiles
方法。对于字典关键字,可以使用FileFilter
的ID
属性。
PageFileCleaner.rarzor
@foreach (var d in filters)
{
<CompFileFilter @key="d.ID" @ref="_fileFilterRefs[d.ID]" FileFilter="d" OnDelete="Delete"></CompFileFilter>
}
@code {
private Dictionary<int, CompFileFilter> _fileFilterRefs = new Dictionary<int, CompFileFilter>();
private async Task ForceClean()
{
// Execute ClearFiles one at a time.
foreach (var item in _fileFilterRefs)
{
await item.Value.ClearFiles();
}
// Or execute them in parallel.
//var tasks = _fileFilterRefs.Select(item => Task.Run(item.Value.ClearFiles));
//await Task.WhenAll(tasks);
}
}
ClearFiles
方法不需要PathName
参数。您可以从FileFilter
参数中获取PathName
。
CompFileFilter.rarzor
@code {
[Parameter]
public FileFilter FileFilter { get; set; }
public async Task ClearFiles()
{
var pathName = FileFilter.PathName;
// filtering code...
}
}
编辑:
无论何时从filters
列表中删除项目,都应该手动更新_fileFilterRefs
字典,以保持它们的同步。例如
private void Delete(FileFilter fileFilter)
{
_filters.Remove(fileFilter);
_fileFilterRefs.Remove(fileFilter.ID);
}
无论何时将filters
列表设置为新列表,都应清除_fileFilterRefs
字典。例如
private async Task RefreshFilters()
{
_fileFilterRefs.Clear();
_filters = await filterService.GetFileFilters();
}
但当您向filters
列表(_filters.Add(...)
(添加新项目时,不必执行相同的操作。在这种情况下,它是自动处理的
总结:
- 过滤器。添加(new FileFilter(((->什么也不做
- 过滤器。删除(fileFilter(->删除fileFilter。ID密钥来自_fileFilterRefs
- filters=new List((->在设置列表之前清除_fileFilterRefs
https://github.com/dotnet/aspnetcore/issues/17361#issuecomment-558138782