在代码部分的组件中使用 foreach 循环中的当前项

using current item from foreach loop in component in code section

快速提问...

下面的代码"legal"在Blazor中吗?我的意思是我可以相信 currentTag 变量永远是正确的,还是我必须以某种方式 "lock" 它?不确定如何从循环中获取当前项并在代码中使用它。

我在一个组件上有一个 foreach 循环,然后将当前项目保存到我下面代码中的一个变量中。该变量在绑定到另一个子组件后立即使用


@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();
    }

到目前为止,它似乎适用于我的测试,但不确定我是否只是幸运 :) 可以尝试在这里和那里做一些延迟以测试更多。

您的 @foreach 块正在为每次迭代设置 currentDataTag 字段,因此最后一次迭代的值是它停止的位置。您的代码正在运行,这很好,但现在您有一个字段,其值可能会歪曲您稍后尝试做的事情。

我可能会删除这部分:

// Set currentDataTag 
@{currentDataTag = dataTag;
}

并找到一种方法来完成最初需要在同一个循环迭代中用 currentDataTag 完成的所有事情。如果它绑定到另一个组件,则也在循环内渲染该组件。这样您就可以避免 可能 由于依赖循环外的状态而出现的任何问题,即如果该值从其他地方更改或在意外时间读取时会怎样。

作为最后的手段,在每次循环迭代结束时,将 currentDataTag 设置为 null 或一个基值,这样您以后就无法读取陈旧或不正确的数据。 Post 如果这没有帮助,请为我们提供更多代码以获得更好的上下文。