Pergunta

Say I tem dois controles de script e um controle tem o outro como um controle filho:

ParentControl : ScriptControl
{
   ChildControl childControl;
}

O script para o controle filho:

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

E no lado roteiro eu quero chamar um método no controle filho:

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

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

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

O problema é que toda vez que tento isso é diz este método não for encontrado ou suportado. não devem todos os métodos no ChildControl ser acessível pela ParentControl?

Existe alguma maneira eu tenho que fazer o público método para que o ParentControl pode vê-lo?

Atualizar Seria possível "tipo" o this._childControl?

Aqui está a razão de eu perguntar ... Quando eu uso Watch, o sistema sabe que a classe ChildControl é, e eu posso chamar métodos fora da própria classe, no entanto, não pode chamar os mesmos métodos fora da this._childControl objeto. Você pensaria que se o design de classe (?) Na memória reconhece o método existente, e objeto instanciado a partir dessa classe faria também.

Foi útil?

Solução

No cliente, você está usando um campo de seu objeto controle pai chamado _childControlID passando-a em $ get. Há alguns problemas com isso:

  1. Como _childControlID obter set? Eu acho que, adicionando-o como uma propriedade no descritor do controle pai no servidor, mas você não mostrar que o código e você não mostrar uma propriedade na classe controle pai do lado do cliente.
  2. $ obter referências retornos de elementos - nem controles. Assim, mesmo se _childControlID foi definida como um elemento de identificação válido, esse elemento não terá um método chamado CallMethod. Se a classe controle filho do lado do cliente foi inicializado antes do controle pai, o elemento terá um campo chamado "controle" que você pode usar para acessar o controle de script que "anexado"-se ao elemento. Isso só funciona se o controle filho inicializados antes do controle pai, é claro.

Outras dicas

O problema é o "presente". Isto, no JavaScript, refere-se ao objecto de DOM. Você precisa fazer algo semelhante ao que acontece quando você usa Function.createDelegate, que é necessário quando se utiliza $ addHandler (que eu sei que você não está usando, apenas dando contexto).

Você tem algumas opções.

  1. Você pode encontrar o seu controle de script filho usando $ find () . Mas você topar com o risco de seu controle pai sendo inicializado antes do controle filho.

    this._childControl = $find(this._childControlID);
    this._childControl.CallMethod();
    
  2. Você pode registrar uma propriedade na sua descritor de controle no servidor usando AddComponentProperty () . Isso fará com que todos os controles filho são inicializados antes do controle pai é inicializado.

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

Então, enquanto você criar uma propriedade do lado do cliente "childControl" ele será automaticamente inicializado e pronto para uso dentro do pai controles método init ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top