在代码部分的组件中使用 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 如果这没有帮助,请为我们提供更多代码以获得更好的上下文。
快速提问...
下面的代码"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 如果这没有帮助,请为我们提供更多代码以获得更好的上下文。