代码之家  ›  专栏  ›  技术社区  ›  enet

添加记录后,EditForm似乎没有更新,为什么

  •  0
  • enet  · 技术社区  · 5 年前

    注意:这是我从Github issues迁移过来的问题( See issue )

    以下是一个以最简单形式显示问题的项目: Code download

    1. 运行项目。
    2. 在索引页上记下名称。
    3. 在表单中添加一个新用户。
    4. 请注意,消息证明新创建的人存在于索引中的列表中,但实际上并没有在组件中呈现。
    5. 导航到计数器,然后返回索引。
    6. 请注意,添加的人现在已在列表中。

    我在页面和组件中都尝试了使用/不使用StateHasChanged()调用。

    页码:

    public void OnCreated(Person person)
    {
        _person = person;
        _created = true;
        Fake.People.Add(person);
        StateHasChanged();
    }
    

    组件:

    private async Task CreateItem()
    {
        _item = CreateFormItem<TItem>(_formProperties);
        await OnCreated.InvokeAsync(_item);
        StateHasChanged();
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   enet    5 年前
    private async Task CreateItem()
    {
        _item = CreateFormItem<TItem>(_formProperties);
        await OnCreated.InvokeAsync(_item);
        StateHasChanged();
    }
    

    呼叫 StateHasChanged(); 在这里毫无意义。

    public void OnCreated(Person person)
    {
        _person = person;
        _created = true;
        Fake.People.Add(person);
        StateHasChanged();
    }
    

    我会做这样的事情:

    public async Task OnCreated(Person person)
       {
           Console.WriteLine(person.FirstName);
           _person = person;
           _created = true;
           Fake.People.Add(person);
    
           await InvokeAsync( () => StateHasChanged());
           
       }
    

    但罪魁祸首不是 StateHasChanged 方法

    解决方案:

    从OnInitialize异步方法中删除此代码段:

    _items = new List<Dictionary<string, object>>();
      foreach (var item in Items) _items.Add(GetItemProperties(item)); 
    
    

    并将其放置在OnParametersSetAsync方法中:

    protected override async Task OnParametersSetAsync()
      {
          await base.OnParametersSetAsync();
         
          _items = new List<Dictionary<string, object>>();
          foreach (var item in Items) _items.Add(GetItemProperties(item));
         
      }