代码之家  ›  专栏  ›  技术社区  ›  TheColonel26

如何从其父级调用组件公共方法?

  •  1
  • TheColonel26  · 技术社区  · 7 年前

    所以我想在子组件(TimeEntryForm)中调用OpenModal()方法。我认为我需要访问TimeEntryForm组件的实例,但我不知道如何创建TimeEntryForm的命名实例。

    父组件

    <button type="button" onclick="@TimeEntryForm.OpenModal()" class="btn btn-info btn-lg">
        <span class="glyphicon glyphicon-plus"></span> Add
    </>
    
    <TimeEntryForm></TimeEntryForm>
    

    @using Chopper.Shared
    @using DatabaseModel.Models
    @page "/timeentryform"
    @inject HttpClient HTTP
    @inherits TimeEntryFormModel
    
    @if (IsOpened)
    {
        <div class="modal" role="dialog" tabindex="-1" style="display: block;">
            <div class="modal-dialog modal-dialog-centered" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Add a Time Entry</h5>
                    </div>
                    <div class="modal-body">
    
                        <form>
                            <div class="form-group">
                                <label for="Job" class="col-form-label">Job:</label>
                                <input type="text" class="form-control" />
                            </div>
                            <div class="form-group">
                                <label for="Employee" class="col-form-label">Employee:</label>
                                <input class="form-control" type="text" />
                            </div>
                            <div class="form-group">
                                <label for="Hours" class="col-form-label">Hours:</label>
                                <input class="form-control" type="text" />
                            </div>
                        </form>
    
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-primary" onclickAsync="@OnAddTimeEntry()">Add Entry</button>
                        <button type="button" class="btn btn-primary" onclick="@CloseModal">Close</button>
                    </div>
                </div>
            </div>
        </div>
        <div class="modal-backdrop show"></div>
    }
    

    时间输入子组件代码隐藏视图模型

    using Chopper.Client.TimeEntries.Services;
    using DatabaseModel.Models;
    using Microsoft.AspNetCore.Blazor.Components;
    using System.Threading.Tasks;
    
    namespace Chopper.Client.TimeEntries
    {
        public class TimeEntryFormModel : BlazorComponent
        {
            protected TimeEntry TimeEntry = new TimeEntry();
    
            [Inject]
            private TimeEntriesServices _client { get; set; }
    
            protected bool IsOpened { get; set; }
    
            public void OpenModal()
            {
                IsOpened = true;
                StateHasChanged();
            }
    
            //[Parameter]
            protected void CloseModal()
            {
                IsOpened = false;
                StateHasChanged();
            }
    
            protected async Task OnAddTimeEntry()
            {
    
                if (TimeEntry.Job != null && TimeEntry.Category != null && TimeEntry.TimeSpentHours > 0 && TimeEntry.Employee != null)
                {
                    await _client.CreateTimeEntry(TimeEntry);
                    await OnInitAsync();
                    StateHasChanged();
                    //return true;
                }
                //return false;
            }
    
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   TheColonel26    7 年前

    所以我需要在的父组件模型中添加一个受保护的成员 protected TimeEntryForm timeEntryForm = new TimeEntryForm();

    <TimeEntryForm ref="timeEntryForm"></TimeEntryForm>

    父组件

    <button type="button" onclick="@timeEntryForm.OpenModal()" class="btn btn-info btn-lg">
        <span class="glyphicon glyphicon-plus"></span> Add
    </>
    
    <TimeEntryForm ref="timeEntryForm"></TimeEntryForm>
    

    public class TimeEntriesGridModel : BlazorComponent
    {
        [Inject]
        private TimeEntriesServices _client { get; set; }
    
        protected TimeEntryForm timeEntryForm; // = new TimeEntryForm(); //Per Kirk Woll's suggestion
    
        protected List<TimeEntry> Model { get; set; }
    
        protected override async Task OnInitAsync()
        {
            Model = await _client.GetAllTimeEntries();
        }
    
    
    }
    

    TimeEntry子组件

    @using Chopper.Shared
    @using DatabaseModel.Models
    @page "/timeentryform"
    @inject HttpClient HTTP
    @inherits TimeEntryFormModel
    
    @if (IsOpened)
    {
        <div class="modal" role="dialog" tabindex="-1" style="display: block;">
            <div class="modal-dialog modal-dialog-centered" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Add a Time Entry</h5>
                    </div>
                    <div class="modal-body">
    
                        <form>
                            <div class="form-group">
                                <label for="Job" class="col-form-label">Job:</label>
                                <input type="text" class="form-control" />
                            </div>
                            <div class="form-group">
                                <label for="Employee" class="col-form-label">Employee:</label>
                                <input class="form-control" type="text" />
                            </div>
                            <div class="form-group">
                                <label for="Hours" class="col-form-label">Hours:</label>
                                <input class="form-control" type="text" />
                            </div>
                        </form>
    
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-primary" onclickAsync="@OnAddTimeEntry()">Add Entry</button>
                        <button type="button" class="btn btn-primary" onclick="@CloseModal">Close</button>
                    </div>
                </div>
            </div>
        </div>
        <div class="modal-backdrop show"></div>
    }
    

    时间输入子组件代码隐藏视图模型

    using Chopper.Client.TimeEntries.Services;
    using DatabaseModel.Models;
    using Microsoft.AspNetCore.Blazor.Components;
    using System.Threading.Tasks;
    
    namespace Chopper.Client.TimeEntries
    {
        public class TimeEntryFormModel : BlazorComponent
        {
            protected TimeEntry TimeEntry = new TimeEntry();
    
            [Inject]
            private TimeEntriesServices _client { get; set; }
    
            protected bool IsOpened { get; set; }
    
            public void OpenModal()
            {
                IsOpened = true;
                StateHasChanged();
            }
    
            //[Parameter]
            protected void CloseModal()
            {
                IsOpened = false;
                StateHasChanged();
            }
    
            protected async Task OnAddTimeEntry()
            {
    
                if (TimeEntry.Job != null && TimeEntry.Category != null && TimeEntry.TimeSpentHours > 0 && TimeEntry.Employee != null)
                {
                    await _client.CreateTimeEntry(TimeEntry);
                    await OnInitAsync();
                    StateHasChanged();
                    //return true;
                }
                //return false;
            }
    
        }
    }
    

    环境影响评价: