c# - 使用父级从组件 Blazor 调用方法

标签 c# components blazor parent-child parent

我的组件中有一个名为 ClearFiles(string PathName) 的方法,当前我通过单击组件上的一个按钮来调用该方法,但现在我试图立即调用它们,但我不知道该怎么做这。从组件调用单个 ClearFiles 方法效果很好,但我不太确定如何使用父类一次调用所有这些方法。我在父类中创建了一个名为 ForceClean 的按钮,我希望按下该按钮可以调用所有组件的清除文件功能。

我在 PageFileCleaner.razor 文件中使用 for 循环在父类中创建组件,如下所示:

@foreach (var d in filters)
{
     <CompFileFilter FileFilter="d" OnDelete="Delete" ></CompFileFilter>
}

其中filters是FileFilter类型的列表,位于命名空间Common.DB中。这是在父类中声明的方式:

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();
        }

这个参数(在子类中)是我使用 FileFilter.Pathname 或 FileFilter.ID 从数据库中的该行获取值的参数,例如:

    [Parameter]
    public FileFilter FileFilter { get; set; }

数据库/文件过滤器对象类:

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; }
       ...
    }
}

清除文件功能位于我的组件/子 CompFileFilter.razor 文件中(删除了本示例的代码,因为它有一百多行代码)。我正在父类中创建组件,每个组件都将具有此 ClearFiles() 方法。

public async Task ClearFiles(string PathName)
{  
     filtering code... 
} 

如何从父类循环访问我的组件并调用所有 ClearFiles() 方法?

最佳答案

您可以使用字典并存储每个 CompFileFilter 组件的引用。然后使用引用调用 ClearFiles 方法。您可以使用 FileFilterID 属性作为字典键。

PageFileCleaner.razor

@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.razor

@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(...) )。在这种情况下,它会自动处理。

总结:

  • filters.Add(new FileFilter()) -> 不执行任何操作。
  • filters.Remove(fileFilter) -> 从中删除 fileFilter.ID 键 _fileFilterRefs
  • filters = new List() -> 在设置列表之前清除 _fileFilterRefs

https://github.com/dotnet/aspnetcore/issues/17361#issuecomment-558138782

关于c# - 使用父级从组件 Blazor 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73575202/

相关文章:

c# - 无法从 C# 调用用 C++ 编写的 dll 函数

c# - 确定表单是否完全不在屏幕上

c# - 无法使用 http 客户端获取 asp.net Web API token

vue.js - vue js ag-grid 过滤器组件不起作用

css - 无法将 css 应用于 React className

c# - 浏览器选项卡上的 Blazor 服务器端 Fluxor 调度操作关闭

c# - ClosedXML 返回文件

c# - 如何确定从 C# 运行的 python 脚本已通过或失败

javascript - useEffect hook 完成后如何渲染组件?

blazor - 带有 C# 代码的 Blazor 中的动态 _Hosts.cshtml 文件