используя текущий элемент из foreach l oop в компоненте в разделе кода - PullRequest
0 голосов
/ 28 апреля 2020

Быстрый вопрос ...

Является ли следующий код "законным" в Blazor? Я имею в виду, могу ли я верить, что переменная currentTag всегда будет правильной, или мне нужно как-то ее «заблокировать»? Не уверен, как еще получить текущий элемент из l oop и использовать его в коде.

У меня есть foreach l oop для компонента, а затем сохранить текущий элемент в переменную в моем код ниже. Переменная используется сразу после того, как она связалась с другим дочерним компонентом


@if (DataTags != null)
{
    @foreach (var dataTag in DataTags)
    {
       // Set currentDataTag 
       @{currentDataTag = dataTag;
        }
          <TagValueForm @bind-TagKeyValuePair="TagKeyValuePair" DataTag="dataTag"></TagValueForm>
    }
}

@code {
    [Parameter]
    public ICollection<Tag> DataTags { get; set; }

    [Parameter]
    public IDictionary<string, string> Tags { get; set; } 

    // Use the current tag:
    private Tag currentDataTag;

    private KeyValuePair<string, string> _tagKeyValuePair;
    private KeyValuePair<string, string> TagKeyValuePair
    {
        get
        {
            if (currentDataTag != null) //would never be null.. or?
            {
                return new KeyValuePair<string, string>(Tags.Keys.Where(x => x == currentDataTag.Name).FirstOrDefault(), Tags[currentDataTag.Name]);
            }
            else
            {
                return _tagKeyValuePair;
            }
        }
        set
        {
            //Update tag dictionary
            _tagKeyValuePair = value;
            Tags[_tagKeyValuePair.Key] = _tagKeyValuePair.Value;
            TagsChanged.InvokeAsync(Tags);
        }
    }


}


protected async override Task OnParametersSetAsync()
    {
        if (Tags == null)
        {
            Tags = new Dictionary<string, string>();
        }

        if (DataTags != null)
        {
            Tags = DataTags.ToDictionary(x => x.Name, x => { return Tags.ContainsKey(x.Name) ? Tags[x.Name] : null; });
        }


        await base.OnParametersSetAsync();
    }

Кажется, она пока работает с моими тестами, но не уверена, что мне просто повезло :) Можно попытаться сделать некоторые задержки здесь и там, чтобы проверить больше.

1 Ответ

1 голос
/ 28 апреля 2020

Ваш блок @foreach устанавливает поле currentDataTag для каждой итерации, поэтому в конце значение последней итерации находится там, где оно останавливается. Ваш код работает, и это хорошо, но теперь у вас есть поле со значением, которое может искажать то, что вы пытаетесь сделать позже.

Я бы, вероятно, удалил эту часть:

// Set currentDataTag 
@{currentDataTag = dataTag;
}

и нашел бы способ сделать все, что нужно было сделать изначально, с помощью currentDataTag в той же итерации l oop. Если он связан с другим компонентом, визуализируйте этот компонент также внутри l oop. Таким образом, вы можете избежать любых проблем, которые могут возникнуть в результате зависимости от состояния вне l oop, то есть, что, если это значение было изменено откуда-то еще или прочитано из неожиданного времени.

В крайнем случае, в конце каждой итерации l oop установите для currentDataTag нулевое или базовое значение, чтобы впоследствии не прочитать устаревшие или неверные данные. Напишите нам немного кода для лучшего контекста, если это не поможет.

...