Frage

Sagen wir, ich habe zwei Skript-Steuerelemente und ein Steuerelement hat die andere als ein untergeordnetes Steuerelement:

ParentControl : ScriptControl
{
   ChildControl childControl;
}

Das Skript für die Kindersicherung:

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

Und auf Skript Seite Ich möchte eine Methode für das Kind Kontrolle nennen:

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

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

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

Das Problem ist, jedes Mal wenn ich versuche, dies ist diese Methode sagt, ist nicht gefunden oder unterstützt. Sollten nicht alle Methoden auf dem Child vom Parent zugänglich sein?

Gibt es eine Möglichkeit ich habe, um das Verfahren öffentlich zu machen, so dass der Parent es sehen kann?

Aktualisieren Wäre es möglich, die this._childControl zu „geben“?

Hier ist der Grund, warum ich fragen ... Als ich Uhr verwenden, das System weiß, was die Child Klasse ist, und ich kann selbst Methoden aus der Klasse aufrufen, jedoch kann ich die gleichen Methoden nicht nennen die this._childControl off Objekt. Sie würden denken, dass, wenn die Klasse Design (?) Im Speicher erkennt das Verfahren bestehenden und Objekt von dieser Klasse instanziiert würde auch.

War es hilfreich?

Lösung

Auf dem Client verwenden Sie ein Feld Ihrer Muttersteuerobjekt namens _childControlID, indem sie in $ erhalten vorbei. Es gibt ein paar Probleme mit diesem:

  1. Wie haben _childControlID gesetzt bekommen? Ich würde vermuten, indem sie es als eine Eigenschaft in der übergeordneten Steuerung des Deskriptors auf dem Server hinzufügen, aber sie zeigen nicht, dass Code und Sie nicht eine Eigenschaft auf der Client-Seite übergeordnete Steuerklasse zeigen.
  2. $ kehrt Element Referenzen bekommen - nicht kontrolliert. Also selbst wenn _childControlID auf eine gültige Element-ID festgelegt wurde, wird dieses Element nicht über eine Methode namens Callmethod. Wenn der Client-Seite Kind Steuerklasse vor dem übergeordneten Steuerelement initialisiert wurde, hat das Element ein Feld „Kontrolle“ genannt, dass Sie die Skriptsteuerung verwenden können, um Zugriff auf das „angehängt“ sich auf das Element. Dies funktioniert nur, wenn die Steuer Kind vor dem Kontrolleltern initialisiert, natürlich.

Andere Tipps

Das Problem ist die "this." Diese, in JavaScript, bezieht sich auf das DOM-Objekt. Sie müssen etwas ähnliches tun, was passiert, wenn Sie Function.createDelegate verwenden, die erforderlich ist, wenn $ addHandler mit (was ich weiß, dass du nicht verwenden, nur Kontext zu geben).

Sie haben ein paar Optionen.

  1. Sie können Ihr Kind Skriptsteuerung mithilfe von $ find () finden. Aber Sie laufen in die Gefahr Ihrer Mutter Kontrolle, bevor die Steuer Kind initialisiert wird.

    this._childControl = $find(this._childControlID);
    this._childControl.CallMethod();
    
  2. Sie können eine Eigenschaft in Ihrer Steuerungsbeschreibung auf dem Server unter Verwendung von AddComponentProperty () registrieren. Dadurch wird sichergestellt, dass alle untergeordneten Steuerelemente initialisiert werden, bevor das übergeordnete Steuerelement initialisiert wird.

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

Dann solange Sie eine Client-Seite-Eigenschaft „Child“ schaffen es wird automatisch innerhalb der übergeordneten zur Verwendung initialisiert und bereit Kontrollen init () -Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top