Можно ли получить список фрагментов RenderFragment при переопределении BuildRenderTree? - PullRequest
0 голосов
/ 05 июня 2019

Мне интересно, можно ли ссылаться на дочерние элементы в параметре ChildContent компонента.Я могу передать значения от родительских компонентов дочерним элементам явным образом или с помощью каскадного параметра, но у родительского компонента нет отличного способа «узнать» об элементах внутри ChildContent RenderFragment.Возможный вариант использования для этого: UIList компонент, который получает число UIListItems, которое было добавлено к UIList компоненту во время процесса рендеринга.

Я попытался переопределитьBuildRenderTree метод в моем компоненте для манипулирования ChildContent RenderFragment вручную, но мои единственные варианты - визуализировать или игнорировать фрагмент (я не могу посмотреть содержимое делегата RenderFragment).

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        int seq = 0;
        base.BuildRenderTree(builder);
        builder.OpenElement(seq++, "div");
        builder.AddContent(seq++, this.ChildContent);
        builder.CloseElement();
    }

Мне интересно, возможно ли что-то подобное ниже.Обратите внимание, что приведенный ниже синтаксис недопустим, это всего лишь пример, который поможет понять смысл.

    protected int NumberOfItems{get;set;}

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        int seq = 0;
        base.BuildRenderTree(builder);
        builder.OpenElement(seq++, "div");
        foreach(var childFragment in this.ChildContent.GetFragments())
        {

           if(childFragment is UIListItem)
                NumberOfItems++;
           builder.AddContent(seq++,childFragment);
        }


        builder.CloseElement();
    }

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Поскольку Исаак заявляет, что то, как вы пытаетесь решить свою проблему, невозможно с Blazor. Тем не менее, дочерние элементы могут зарегистрировать себя с родителем с помощью CascadingParameter. Кажется, что он достиг бы того, чего вы хотите, он просто идет к этому с другой стороны. Позвольте мне попробовать пример ...

С учетом этой настройки

<ParentComponent>
    <ChildComponent></ChildComponent>
    <ChildComponent></ChildComponent>
    <ChildComponent></ChildComponent>
</ParentComponent>

Я думаю, что вы ищете такой вывод

<div>
    <p>Total Items: 3</p>
    <div>Child Component</div>
    <div>Child Component</div>
    <div>Child Component</div>
</div>

Родительский компонент

<div>
    <p>Total Items: @ItemCount</p>
    <CascadingValue Value="this">
        @ChildContent
    </CascadingValue>
</div>

@functions {

    private int ItemCount;

    public void AddItem()
    {
        ItemCount++;
        StateHasChanged();
    }

}
<div>Child Component</div>

@functions {

    [CascadingParameter] private ParentComponet Parent { get; set; }

    protected override void OnInit()
    {
        Parent.AddItem();
    }

}

Это должно достичь того, что вы ищете, если я правильно понял вашу потребность.

Одна вещь, которую я бы сказал, это попытаться избежать переопределения BuildRenderTree, я написал сообщение в блоге о том, как сделать это правильно, но также указал, почему вы, вероятно, не должны.

0 голосов
/ 05 июня 2019

Это, конечно, невозможно, по крайней мере, не в обозримом будущем. RenderFragment представляет кусок контента для рендеринга, содержание которого, насколько я знаю, и на данный момент не может быть доступно программно, так, как вы хотите ...

В Blazor, как и в жизни, поток данных идет от родительского к дочернему компоненту. Я думаю, именно поэтому нужно разрабатывать его программное обеспечение в соответствии с этим «внутренним» ограничением В принципе, я считаю, что все достижимо, в зависимости от того, сказал бы Дэн Рот, имеющихся ресурсов.

А как насчет шаблонных компонентов? С помощью Templated Component ваш UIList-компонент знает и определяет количество отображаемых UIListItems ...

Кстати, я полагаю, что это единственная дополнительная ценность, которую я могу предоставить в этом ответе: вы не используете последовательность должным образом. Стив Андерсон написал статью об этом; ищите его). Вы не должны использовать инкрементную переменную для выдачи последовательности. Вместо этого вы должны использовать числа, начиная с 0.

Надеюсь, это поможет ...

...