Pregunta

Supongamos que tengo dos controles de script y un control tiene el otro como control secundario:

ParentControl : ScriptControl
{
   ChildControl childControl;
}

El script para el Control de Niños:

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');
    }
}

Y en el lado del script, quiero llamar un método en el control secundario:

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

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

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

El problema es que cada vez que lo intento dice que este método no se encuentra o no es compatible. ¿No debería ser accesible para todos los métodos en el ChildControl el ParentControl?

¿Hay alguna forma de hacer público el método para que ParentControl pueda verlo?

Actualizar ¿Sería posible " escribir " el this._childControl?

Esta es la razón por la que pregunto ... Cuando uso Watch, el sistema sabe qué es la clase ChildControl, y puedo descartar los métodos de la clase en sí, sin embargo, no puedo descartar los mismos métodos de this._childControl objeto. Usted pensaría que si el diseño de la clase (?) En la memoria reconoce el método existente, y el objeto creado de esa clase también lo haría.

¿Fue útil?

Solución

En el cliente, estás usando un campo de tu objeto de control primario llamado _childControlID pasándolo a $ get. Hay algunos problemas con esto:

  1. ¿Cómo se estableció _childControlID? Supongo que al agregarlo como una propiedad en el descriptor del control principal en el servidor, pero no muestra ese código y no muestra una propiedad en la clase de control principal del lado del cliente.
  2. $ get devuelve referencias de elementos, no controles. Entonces, incluso si _childControlID se configuró con un ID de elemento válido, ese elemento no tendrá un método llamado CallMethod. Si la clase de control secundario del lado del cliente se inicializó antes que el control principal, el elemento tendrá un campo llamado "control". que puede usar para acceder al control de script que " adjunto " En sí mismo al elemento. Esto solo funciona si el control secundario se inicializó antes que el control principal, por supuesto.

Otros consejos

El problema es el " este " " Esto, en javaScript, se refiere al objeto DOM. Necesitas hacer algo similar a lo que sucede cuando usas Function.createDelegate, que se requiere cuando usas $ addHandler (que sé que no estás usando, solo doy contexto).

Tienes un par de opciones.

  1. Puede encontrar el control de script de su hijo usando $ find () . Pero corre el riesgo de que su control principal se inicialice antes que el control secundario.

    this._childControl = $find(this._childControlID);
    this._childControl.CallMethod();
    
  2. Puede registrar una propiedad en su descriptor de control en el servidor usando AddComponentProperty () . Esto asegurará que todos los controles secundarios se inicialicen antes de que se inicialice el control principal.

    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 };
         }
    }
    

Luego, siempre que crees una propiedad del lado del cliente " childControl " se inicializará automáticamente y estará listo para su uso dentro del método init () de los controles primarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top