AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77476862
Accepted
David Thielen
David Thielen
Asked: 2023-11-14 05:03:44 +0800 CST2023-11-14 05:03:44 +0800 CST 2023-11-14 05:03:44 +0800 CST

Preciso instanciar novamente o EditContext se o valor for alterado?

  • 772

Eu tenho um parâmetro:

[Parameter]
public RateItemModel Value { get; set; } = default!;

Minha página de barbear tem:

<EditForm EditContext="EditContext" OnValidSubmit="HandleValidSubmitAsync" OnInvalidSubmit="HandleInvalidSubmitAsync" Context="editFormContext">

E durante a inicialização eu faço o seguinte:

EditContext = new EditContext(Value);

Preciso substituir OnParametersSetAsync()e sempre que Valuefor alterado, instanciar novamente EditContext?

Atualizar:

Aqui está o caso de uso. Eu tenho uma lista de cartões de inscrição. Cada cartão de inscrição permite clicar para participar ou não. Quando o usuário clica, o cartão permanece ativo, mas o compromisso alterado deve ser gravado no banco de dados e o cartão precisa exibir o valor do compromisso alterado.

A solução fácil é escrever o novo valor em SignupCard.Commitment, mas isso é proibido. Então...

  1. O clique do usuário altera o valor de Model.Commitment e chama OnClick.
  2. O OnClick cria um Signupobjeto com a Commitmentpropriedade definida para o novo valor.
  3. O EventCardcomponente chama ValueChangeda passagem desse Signupobjeto para a página da lista pai.
  4. A página da lista possui um array atribuído ListPage.Dataà DxListBox.Valuespropriedade do DxListBox.
  5. Ele executa uma cópia superficial desta lista para uma lista temporária var.
  6. A inscrição alterada é atribuída a list[index]essa lista temporária, substituindo o valor antigo.
  7. Os dados também são atualizados no banco de dados.
  8. Esta lista é atribuída a 'ListPage.Data`
  9. A DxListBox.Valuespropriedade é assim alterada. Então agora atualiza SignupCard.Valuepara todos os cartões da lista.
  10. O SignupCardque deu início a tudo isso agora ganha um novo arquivo Value.
  11. Isto agora é aplicado ao " ignupCard.Model(que não deve mudar nada).
  12. E acredito que também preciso recriar EditContextusando esse novo arquivo Value.
blazor
  • 2 2 respostas
  • 28 Views

2 respostas

  • Voted
  1. MrC aka Shaun Curtis
    2023-11-14T05:59:43+08:002023-11-14T05:59:43+08:00

    Sim, você quer. Porque você não pode redefinir o contexto. Se você definir o contexto para um novo objeto, tudo EditForm[incluindo controles de edição] será reconstruído.

    No entanto, supondo que RateItemModelseja uma classe, ou seja, um objeto de referência, sua pergunta levanta vários problemas.

    1. Como você detecta se Valuemudou? As alterações de referência são aceitáveis, mas e se você alterar o objeto fora do contexto de edição. Você substituiu os comparadores iguais para sua classe de dados e, em seguida, verificou a igualdade OnParametersSet?

    2. Por que mudaria Valuee o componente pai forçaria um evento em cascata de renderização? Se os renderizadores pais, então seu componente de edição será porque Valueé um objeto, então ele o renderiza porque não consegue detectar se Valuefoi alterado ou não.

    Supondo que você possa detectar uma alteração, é necessário considerar dois casos:

    1. O formulário atual está limpo. Como informar ao usuário que os dados foram alterados e o formulário foi recarregado?
    2. O formulário atual está sujo. Como você resolve as diferenças?
    • 0
  2. Best Answer
    MrC aka Shaun Curtis
    2023-11-14T19:09:08+08:002023-11-14T19:09:08+08:00

    Aqui está um MRE de demonstração que criei a partir de sua descrição. Fiz algumas suposições para preencher as lacunas e estou usando controles padrão em vez dos caros itens DX.

    Ele usa um dicionário para rastrear os objetos de dados.

    Provavelmente fornece uma visão diferente sobre como implementar o que você está tentando fazer. Há um problema se você editar um valor e depois ir para outro lugar, mas não vou mostrar como resolver isso até ter certeza de que meu MRE está bem próximo do seu caso de uso.

    Meus objetos de dados:

    public class Country
    {
        public int Id { get; init; }  //Normally I would use a Guid, but you're probably using an int
        public string? Name { get; set; }
        public int Likes { get; set; }
        public DateTime LastEdit { get; set; } = DateTime.Now;  //dirty but quick way of tracking equality
    }
    
    // Demo Data provider
    public static class CountryProvider
    {
        private static List<Country> _countries = new()
            {
                new() {Id = 1, Name = "France", Likes= 1 },
                new() {Id = 2, Name = "UK", Likes= 0 },
                new() {Id = 3, Name = "Spain", Likes= 4 },
                new() {Id = 4, Name = "Portugal", Likes= 5 },
            };
    
        public static async Task<IEnumerable<Country>> GetCountries()
        {
            await Task.Delay(100);
            return _countries.AsEnumerable();
        }
    
        public static async Task SaveAsync(Country country)
        {
            // Do the save
            await Task.Delay(50);
        }
    }
    
    public record LikesData(int Id);
    

    O cartão"

    <div class="card">
        <div class="card-header">@Value.Name</div>
        <div class="card-body">
            <div class="alert alert-primary p-2 m-2"> Likes: @_model.Likes</div>
            <EditForm EditContext="_editContext" OnValidSubmit="Submit">
                <div class="input-group mb-3">
                    <InputText class="form-control" @bind-Value="_model.Name" />
                    <button class="btn btn-success" type="submit">Update</button>
                </div>
            </EditForm>
            <div class="m-2 text-end">
                <button class="btn btn-primary" @onclick="UpdateLikes">Like</button>
            </div>
        </div>
    </div>
    
    @code {
        [Parameter] public Country Value { get; set; } = new();
        [Parameter] public EventCallback<Country> ValueChanged { get; set; }
        [Parameter] public EventCallback<LikesData> LikesChanged { get; set; }
    
        private EditContext? _editContext;
        private Country _model = new();
    
        // This is here so we have all our data sorted before any first render
        public override Task SetParametersAsync(ParameterView parameters)
        {
            parameters.SetParameterProperties(this);
    
            ArgumentNullException.ThrowIfNull(this.Value);
    
            // Timestamp used to track edit state.  You can use what mechanism you like
            // I use value objects for all my data simplifying equality checking
            // Country would be public record Country{};
            // and here i would create a CountryEditContext object for editing
            if (this.Value.LastEdit != _model.LastEdit)
            {
                _model = new()
                    {
                        Id = this.Value.Id,
                        Name = this.Value.Name,
                        Likes = this.Value.Likes,
                        LastEdit = this.Value.LastEdit,
                    };
                _editContext = new(_model);
            }
    
            return base.SetParametersAsync(ParameterView.Empty);
        }
    
        //Your return object may be more complex so I've used a value object rather than just an int
        private async Task UpdateLikes()
        {
            await this.LikesChanged.InvokeAsync(new(this.Value.Id));
        }
    
        // Form submit on validation.
        private async Task Submit()
        {
            _model.LastEdit = DateTime.Now;
            await this.ValueChanged.InvokeAsync(_model);
        }
    }
    

    E a página:

    <div class="row">
        @foreach(var country in _countries )
        {
            <div class="col-12 col-md-6 col-lg-4">
                <CountryCard @key="country.Value.Id"
                Value="country.Value" 
                ValueChanged="this.UpdateCountry" 
                LikesChanged="this.UpdateLikes" />
            </div>
        }
    </div>
    
    @code {
    
        // use a dictionary so we can separate out the index from the object and only replace the object on an update
        private Dictionary<int, Country> _countries = new();
    
        protected override async Task OnInitializedAsync()
        {
            var countries = await CountryProvider.GetCountries();
            // normally need to check here if you have a list here and do something if you don't
            foreach(var country in countries)
                _countries.Add(country.Id, country);
        }
    
        private async  Task UpdateCountry(Country country)
        {
            _countries[country.Id] = country;
            await CountryProvider.SaveAsync(country);
        }
    
        private void UpdateLikes(LikesData value)
        {
            _countries[value.Id].Likes++;
            _countries[value.Id].LastEdit = DateTime.Now;
        }
    }
    
    • 0

relate perguntas

  • Como obter o contexto correto para o modelo SfListView dentro do componente EditForm Blazor?

  • Blazor - limpe todas as opções de seleção sem recuperar os dados

  • Manipular index.html no Blazor WASM

  • A ligação do Blazor à entrada de texto não funciona após inserir um valor na entrada

  • A página do Blazor que possui passagem de dados de componente para componente está gerando um erro de evento durante o carregamento

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve