Question

Disons que j'ai deux contrôles de script et qu'un contrôle a l'autre en tant que contrôle enfant:

ParentControl : ScriptControl
{
   ChildControl childControl;
}

Le script du contrôle enfant:

ChildControl = function(element) 
{
  ChildControl.initializeBase(this, [element]);
}

ChildControl.prototype =
{
    callMethod: function()
    {
      return 'hi';
    },

    initialize: function() 
    {
      ChildControl.callBaseMethod(this, 'initialize');
    },

    dispose: function() 
    {
      ChildControl.callBaseMethod(this, 'dispose');
    }
}

Et du côté du script, je souhaite appeler une méthode du contrôle enfant:

ParentControl.prototype =
{
    initialize: function() 
    {
      this._childControl = $get(this._childControlID);
      this._childControl.CallMethod();

      ParentControl.callBaseMethod(this, 'initialize');
    },

    dispose: function() 
    {
      ParentControl.callBaseMethod(this, 'dispose');
    }
}

Le problème, c’est que chaque fois que j’essaie, c’est que cette méthode n’est ni trouvée ni supportée. Toutes les méthodes de ChildControl ne doivent-elles pas être accessibles par ParentControl?

Existe-t-il un moyen de rendre la méthode publique pour que le contrôle parent puisse la voir?

Mettre à jour Serait-il possible de "taper" " le this._childControl?

Voici la raison pour laquelle je demande ... Lorsque j'utilise Watch, le système sait ce qu'est la classe ChildControl et je peux appeler des méthodes de la classe elle-même. Toutefois, je ne peux pas appeler les mêmes méthodes de this._childControl. objet. Vous penseriez que si la classe design (?) En mémoire reconnaît la méthode existante, l'objet instancié à partir de cette classe le serait aussi.

Était-ce utile?

La solution

Sur le client, vous utilisez un champ de votre objet de contrôle parent appelé _childControlID en le transmettant à $ get. Cela pose quelques problèmes:

  1. Comment _childControlID a-t-il été défini? J'imagine que l'ajouter en tant que propriété dans le descripteur du contrôle parent sur le serveur, mais vous n'indiquez pas ce code ni une propriété dans la classe de contrôle parent côté client.
  2. $ get renvoie les références d'élément - pas les contrôles. Ainsi, même si _childControlID était défini sur un ID d'élément valide, cet élément n'aura pas de méthode appelée CallMethod. Si la classe de contrôle enfant côté client s'est initialisée avant le contrôle parent, l'élément aura un champ appelé "contrôle". que vous pouvez utiliser pour accéder au contrôle de script que " attaché " lui-même à l'élément. Cela ne fonctionne que si le contrôle enfant est initialisé avant le contrôle parent, bien sûr.

Autres conseils

Le problème est le " this. " Ceci, en javaScript, fait référence à l'objet DOM. Vous devez faire quelque chose de similaire à ce qui se passe lorsque vous utilisez Function.createDelegate, qui est requis lorsque vous utilisez $ addHandler (que je sais que vous n'utilisez pas, mais qui donne simplement un contexte).

Vous avez plusieurs options.

  1. Vous pouvez trouver votre contrôle de script enfant en utilisant $ find () . Mais vous courez le risque que votre contrôle parent soit initialisé avant le contrôle enfant.

    this._childControl = $find(this._childControlID);
    this._childControl.CallMethod();
    
  2. Vous pouvez enregistrer une propriété dans votre descripteur de contrôle sur le serveur à l'aide de AddComponentProperty () . Cela garantira que tous les contrôles enfants sont initialisés avant le contrôle parent.

    public class CustomControl : WebControl, IScriptControl
    {
         public ScriptControl ChildControl { get; set; }
    
         public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
         {
             var descriptor = new ScriptControlDescriptor("Namespace.MyCustomControl", this.ClientID);
             descriptor.AddComponentProperty("childControl", ChildControl.ClientID);
    
             return new ScriptDescriptor[] { descriptor };
         }
    
         public IEnumerable<ScriptReference> GetScriptReferences()
         {
             var reference = new ScriptReference
                             {
                                 Assembly = this.GetType().Assembly.FullName,
                                 Name = "MyCustomControl.js"
                             };
    
             return new ScriptReference[] { reference };
         }
    }
    

Ensuite, tant que vous créez une propriété côté client " childControl " il sera automatiquement initialisé et prêt à être utilisé dans la méthode de contrôles parent init ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top