ASP.Net ScriptControl - Chamada um método de outro
-
03-07-2019 - |
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.
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:
- 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.
- $ 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.
-
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();
-
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 ().