使用parent从组件Blazor调用方法



我的组件中有一个名为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方法。对于字典关键字,可以使用FileFilterID属性。

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

相关内容

  • 没有找到相关文章

最新更新