Как я могу получить доступ к функции в ChildComponent из другого ChildComponent в. NET Blazor - PullRequest
0 голосов
/ 16 января 2020

Я посмотрел через Google и нашел решения только для тех случаев, когда можно достичь функций / значений от дочернего к родительскому и наоборот, но не от chil к дочернему.

Родительский компонент, контейнер для дочерних компонентов

 //PARENT 
<h3>ParentComponent</h3>
<Child_1_Component></Child_1_Component>

<Child_2_Component></Child_2_Component>

<h3>Child_1_Component</h3>

РЕБЕНОК 1 Пользователь вводит что-то

//CHILD 1
<h1>User puts in something</h1>
<input type="text"/>
<button @onclick="@(() => getValue(10))"></button>

@code {
    List<WhatEver> whatEvers = new List<WhatEver>();

    public void getValue(int value)
    {
        var message = "something";
        for (int i = 0; i < value; i++)
        {
            var whatever = new WhatEver();
            whatever.Name = message;
            whatEvers.Add(whatever);
        }
        //Sends value to Service
    }
}

РЕБЕНОК 2 Показывает через службу то, что пользователь вложил в дочернего элемента 1, и дает пользователю возможность изменять значение.

И здесь я хочу, чтобы была возможность достичь функции у ребенка 1

<h3>Child_2_Component</h3>
<h1>Displays Value from service and lets user put in new value</h1>
<input type="text" />
<button @onclick="@(() => getValue(10))"></button>

@*Here I want to use the funcction getValue(x) in Child_1_Component*@

1 Ответ

1 голос
/ 16 января 2020

Определите класс Worker и введите значение getValue (int).

public class Worker{
    public object getValue(int value){
       //[...]
       return something;
    }
}

Тогда есть две возможности:

Решение 1

Создайте экземпляр Worker в родительском элементе обоих дочерних элементов и поместите его в оба дочерних элемента.

//PARENT 
<h3>ParentComponent</h3>
<Child_1_Component Worker="@MyWorker"></Child_1_Component>
<Child_2_Component Worker="@MyWorker"></Child_2_Component>

<h3>Child_1_Component</h3>

@code {
    private Worker MyWorker{ get; set; }

    protected override void OnInitialized()
    {
       MyWorker = new Worker();   
    }
}

И затем дочерний элемент, где Worker - это один и тот же объект в обоих дочерних элементах:

//CHILD 1
<h1>User puts in something</h1>
<input type="text"/>
<button @onclick="@(() => Worker.getValue(10))"></button>

@code {
    [Parameter]
    public Worker Worker { get; set; }        
}

Решение 2:

Вы перемещаете getValue (int value) в Service и определяете его в Startup.cs, тогда оба дочерних элемента имеют одинаковый экземпляр.

 //Startup.cs
 public void ConfigureServices(IServiceCollection services)
 {
    [...]
    services.AddScoped<Worker>();
 }

А потом Дитя, где Работник является одним и тем же объектом в обоих:

//CHILD 1
@inject Worker MyWorker
<h1>User puts in something</h1>
<input type="text"/>
<button @onclick="@(() => MyWorker.getValue(10))"></button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...