Компонент Blazor инициализируется, но не виден? - PullRequest
0 голосов
/ 21 января 2020

Я сейчас немного работаю с Blazor и попал в довольно странную ошибку. Итак, у меня есть родительский компонент, который имеет дочерний компонент, и у него есть сам дочерний компонент, и оба передают Объект дочернему компоненту. Примерно так:

Parent.razor

<ChildComponent @bind-Model="Model" ObjectListConverted="ObjectListConverted"/>

@code {
List<Object> ObjectListConverted = new List<Object>();
}

и

Childcomponent.razor

<MyOwnChild Item="@((Item)obj)"/>

Пока все хорошо. Теперь происходит интересная вещь. Родитель и дочерний компонент инициализируются прямо при загрузке страницы. MyOwnChild-Component может быть загружен только после преобразования некоторых вещей, что происходит в onInitialized () - методе Childcomponent.razor. Я проверил, работает ли преобразование, и фактически инициализируется компонент MyOwnChild (который я проверял с помощью регистрации), но он не виден. Я попытался использовать testComponent, просто содержащий -Tag с некоторым содержанием, но он также не отображается. Также проверил html, который генерируется для hidden-div, либо из-за css, либо из-за неправильно назначенного скрытого атрибута, но ничего подобного не найдено. Это довольно странно. Вероятно, важно знать, что MyOwnChild использует себя рекурсивно, если obj раскрыт, но по умолчанию это false. Кроме того, он связан в большем контексте, поэтому ChildComponent.razor фактически содержит два цикла foreach, один с преобразованным материалом, другой со списком, в который добавляются только элементы при взаимодействии с пользователем:

Childcomponent.razor

@foreach (Object obj in ObjectListConverted)
                {
                    if (obj.IsFolder) //This evaluates to true in all cases right now.
                    {
                        <MyOwnChild Item="@((Item)obj)"/>
                        Console.WriteLine("Hey, it´s a folder!"); //This is logged.
                    }
                }
                @if (Model.OtherList != null)
                {
                    @foreach (DetailedObject obj in Model.OtherList)
                    {
                        if (obj.IsFolder)
                        {
                           <MyOwnChild Item="@((Item)obj)"/>
                        }
                    }
                }

@code {
[Parameter]
List<Object> ObjectListConverted {get; set;}
[Parameter]
Model Model {get; set;} = new Model();

protected override void OnInitialized() {
ObjectListConverted = ConvertToStructuredList(Model.List);
base.StateHasChanged();
}
}

Таким образом, хотя верхняя версия MyOwnChild.razor вообще не отображается вообще, хотя и инициализирована, нет проблем с ее отображением после добавления нового элемента в otherList. Наследование выглядит следующим образом:

Item:DetailedObject:Object

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

Спасибо за помощь. :)

1 Ответ

0 голосов
/ 24 января 2020

Итак, я сам решил проблему. Это было довольно сложно. Таким образом, проблема заключалась в следующем: ObjectlistConverted в ChildComponent является параметром, поскольку его планируется привязать к списку родителей. При состоянии ошибки оно еще не было связано. Таким образом, OnInitialization для ChildComponent Parent дает пустой список, чтобы ModelListConverted не был нулевым. Поскольку OnInitialized-метод вызывает метод преобразования, он меняет ModelListConverted на другую ссылку. Потому что это не связано с родителем, родитель все еще держит старый список, не обновляя ссылку. Когда вызывается base.StateHasChanged (), все перерисовывается. Родитель видит, что ссылка на дочерний компонент больше не является действительной, и возвращает ему старую ссылку во второй раз. Потому что он только перерисовывается и не инициализируется снова, он не преобразует список во второй раз, не позволяет программе выбросить ошибку переполнения стека или попасть в бесконечный l oop. Теперь он просто берет пустой список, поэтому сразу после инициализации компонента MyOwnChild он снова удаляет его, потому что в списке больше нет элемента для него.

...