Blazor дочерние компоненты - PullRequest
0 голосов
/ 26 февраля 2019

Я ищу способ неявной передачи параметров из родительского компонента в дочерний компонент.Позвольте мне объяснить: я кодировал Компонент с именем InputValidation, чтобы проверить входные данные (связанные Свойством) с условием, которое мы можем установить.

Вчера я спросил сообщество StackOverflow, как получить ссылки (сначала по Reflection) на каждый дочерний компонент.Тема здесь => Blazor получает вложенные компоненты с помощью Reflection

Кстати, еще раз спасибо вкладчику, который помог мне.

Теперь я хочу вложить еще один компонент chid в это InputValidation.Вот так:

<InputValidation ref="@InputValidationRef" Property="@lang.Value">
    <ValidationCase TItem="string" On="@(x => !string.IsNullOrEmpty(x))" Message="Test message" />
    <ValidationCase TItem="string" On="@(x => x == "A text")" Message="Test message" />
</InputValidation>

Я закодировал свои компоненты так:

InputValidation

@using System.Linq.Expressions;

@typeparam TItem

    @*<span class="form-text text-danger">@Message</span>*@
    <CascadingValue Value="Property">
        <div>
            @ChildContent
        </div>
    </CascadingValue>

@functions {

    [Parameter]
    TItem Property { get; set; }

    [Parameter]
    public RenderFragment<ValidationCase<TItem>>[] ChildContent { get; private set; }

    public bool Valid { get; set; }
}

ValidationCase

@using System.Linq.Expressions;

@typeparam TItem

<span id="test" class="form-text text-danger">@Message</span>

@functions {

    [CascadingParameter]
    private TItem Property { get; set; }

    [Parameter]
    protected Expression<Func<TItem, bool>> On { get; set; }

    [Parameter]
    protected string Message { get; set; }

    internal bool Valid { get; set; }

    protected async override Task OnParametersSetAsync()
    {
        Valid = !On.Compile().Invoke(Property);
    }
}

Что я хотел бы знать:

  • Допустим ли этот подход?
  • Есть ли способ не вызывать TItem = "string" явно в объявлении ValidationCase?Если мы этого не сделаем, тип параметра выражения не может быть вычтен.Даже если сделать это, вставив CascadingValue.

Спасибо за ответы.

РЕДАКТИРОВАТЬ 03/01:

Мне пришлось действовать иначе,Вместо использования View для ValidationCase я использую имена компонентов только для кода ValCase

[Route("val-case")]
public class ValCase<TItem> : ComponentBase
{
    [CascadingParameter]
    private InputValidation<TItem> parent { get; set; }

    [Parameter]
    protected Expression<Func<TItem, bool>> On { get; set; }

    [Parameter]
    protected string Message { get; set; }

    internal bool Valid { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        var seq = 0;
        builder.OpenElement(++seq, "li");
        builder.OpenElement(++seq, "span");
        builder.AddAttribute(++seq, "id", "test");
        builder.AddAttribute(++seq, "class", "form-text text-danger");
        builder.AddContent(++seq, Message);
        builder.CloseElement();
        builder.CloseElement();
    }

    protected override void OnInit()
    {
        parent.Items.Add(this);
    }

    protected override bool ShouldRender()
    {
        return true;
    }

    protected async override Task OnParametersSetAsync()
    {
        Valid = !On.Compile().Invoke(parent.Property);
    }
}

Рендеринг в порядке ... но только в первый раз.ValCase больше не отображается каждый раз, когда я обновляю значение свойства.Я поместил Console.WriteLine в метод OnParametersSetAsync, но, похоже, этот метод больше не вызывается.

Кто-то может помочь мне найти способ исправить это?

...