1
votes

Exécution de la méthode lors du changement de paramètre

Étant donné un enfant et un composant parent, j'essaie d'exécuter une méthode avec l ' enfant lorsqu'un paramètre a changé (du parent).

Parent

@(value?"True":"False")
@functions()
{
  [Parameter]
  protected bool value {get;set;}

  public void SideEffect()
  {
    Console.WriteLine("has changed"); //i want this method executed when value changes from parent
  }

Enfant

<Child value=@IsChanged></Child>

<button onclick="Update"></button>

@functions(){
  public bool IsChanged{get;set;}
  public void Update()
  {
   this.IsChanged!=this.IsChanged;
  }

Comme vous pouvez le voir, j'ai besoin pour exécuter la méthode à l'intérieur du Child lors du changement du paramètre.Le paramètre est changé dans le parent.

PS
J'ai regardé sur le onchange eventhandler mais je dois exécuter sur un [Parameter .


0 commentaires

3 Réponses :


10
votes

Vous devez remplacer la méthode de cycle de vie OnParametersSet ou OnParametersSetAsync .

Enfant

@(_value ? "True" : "False")

@code()
{
  private bool _value;

  [Parameter] public bool Value { get; set; }

  protected override void OnInitialized()
  {
      _value = Value;
  }

  protected override void OnParametersSet()
  {
      if (_value != Value)
      {
          _value = Value;
          Console.WriteLine("a parameter has changed");
      }
  }
}


4 commentaires

Mais que faire si je veux différents effets secondaires pour différents paramètres? Cette méthode est-elle appelée lors d'un changement de paramètre? Est-ce que je ne peux pas correspondre au modèle ou quelque chose?


Cette méthode sera appelée lorsqu'un paramètre change. Vous pouvez ainsi vérifier chacun de vos paramètres et apporter des modifications en fonction de ceux qui ont changé.


@ChrisSainty La question stupide mais évidente: comment les vérifier pour déterminer laquelle a changé? Devez-vous conserver une copie de tous vos paramètres pour pouvoir faire une comparaison?


@BrianMacKay Cela dépend vraiment de ce que vous devez faire. Si vous regardez le code source de Blazor, ce modèle est courant. Ils conservent des copies locales des paramètres, puis les vérifient pendant le cycle de vie d'OnParametersSet pour les modifications. Ils le font pour des raisons de performances, donc seuls les paramètres ayant des implications sur les performances sont copiés.



2
votes

Selon votre code, chaque fois que vous cliquez sur le bouton "Mettre à jour" dans le composant parent, la valeur de la propriété "value" du composant enfant est mise à jour. Cela devrait fonctionner. Maintenant, dans le composant enfant, vous voulez que la méthode SideEffect s'exécute chaque fois que la valeur de la propriété "value" a changé, et vous voulez savoir comment le faire, non ???? Vous pouvez passer une référence d'objet du composant enfant au composant parent, qui peut l'utiliser pour appeler la méthode SideEffect sur le composant enfant comme ceci:

public void Update()
  {
   this.IsChanged!=this.IsChanged;
   // Code to call the SideEffect method on the Child Component
  }

Bien sûr, il existe d'autres moyens, peut-être mieux, pour atteindre cet objectif. Vous pouvez utiliser un délégué d'événement dans le composant parent qui est déclenché chaque fois que vous cliquez sur le bouton "Mettre à jour", auquel votre composant enfant peut s'abonner. Vous pouvez lire ma réponse à votre question précédente pour avoir un aperçu de la façon de procéder. Vous pouvez même utiliser C # INotifyPropertyChanged pour implémenter cela.

Veuillez marquer ma réponse comme acceptée si elle vous a aidé J'espère que cela vous aidera ...


0 commentaires

8
votes

Voici la solution la meilleure et la plus simple à votre question

 @code
    {
       // private backing field for setting and retrieving the property  value
      private bool _value;
      [Parameter]
      public bool MyValue {
          get{return _value;}
          set {
            if( _value != value)
            {
               _value = value;
                // Call the SideEffect method whenever a new value 
                   is assigned to the property. 
                this.SideEffect();
            }
          }
       }
      public void SideEffect()
      {
        Console.WriteLine("has changed"); //i want this method executed when value changes from parent
      }


1 commentaires

Le paramètre setter dans Blazor est appelé à chaque appel EventCallback. Donc SideEffect sera déclenché même si la valeur n'a pas changé. On dirait que ce code nécessite un test de valeur comme ... set {if (value! = _ Value) {_value = value; this.SideEffect (); }} ...