0

2 つのスクリプト コントロールがあり、1 つのコントロールにもう 1 つの子コントロールがあるとします。

ParentControl : ScriptControl
{
   ChildControl childControl;
}

子コントロールのスクリプト:

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

スクリプト側では、子コントロールのメソッドを呼び出したい:

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

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

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

問題は、これを試すたびに、このメソッドが見つからないかサポートされていないと表示されることです。ChildControl のすべてのメソッドに ParentControl からアクセスできるようにすべきではありませんか?

ParentControl がそれを見ることができるように、メソッドを公開する必要がある方法はありますか?

更新 this._childControl を「入力」することは可能でしょうか?

これが私が尋ねる理由です... Watchを使用すると、システムはChildControlクラスが何であるかを認識し、クラス自体からメソッドを呼び出すことができますが、this._childControlオブジェクトから同じメソッドを呼び出すことはできません. メモリ内のクラス設計 (?) が既存のメソッドを認識し、そのクラスからインスタンス化されたオブジェクトも認識すると考えるでしょう。

4

3 に答える 3

1

問題は「これ」です。これは、JavaScript では DOM オブジェクトを参照します。Function.createDelegate を使用する場合と同様のことを行う必要があります。これは、$addHandler を使用する場合に必要です (使用していないことはわかっていますが、コンテキストを提供するだけです)。

于 2008-12-30T20:36:30.553 に答える
1

クライアントでは、親コントロール オブジェクトの _childControlID というフィールドを $get に渡して使用しています。これにはいくつかの問題があります:

  1. _childControlID はどのように設定されましたか? サーバー上の親コントロールの記述子にプロパティとして追加することで推測できますが、そのコードは表示されず、クライアント側の親コントロール クラスにはプロパティが表示されません。
  2. $get は、コントロールではなく要素参照を返します。したがって、_childControlID が有効な要素 ID に設定されていたとしても、その要素には CallMethod というメソッドはありません。クライアント側の子コントロール クラスが親コントロールの前に初期化された場合、要素には、それ自体を要素に「アタッチ」したスクリプト コントロールにアクセスするために使用できる「control」というフィールドがあります。もちろん、これは子コントロールが親コントロールの前に初期化された場合にのみ機能します。
于 2008-12-31T08:08:42.590 に答える
0

いくつかのオプションがあります。

  1. $find()を使用して、子スクリプト コントロールを見つけることができます。ただし、子コントロールの前に親コントロールが初期化されるリスクがあります。

    this._childControl = $find(this._childControlID);
    this._childControl.CallMethod();
    
  2. AddComponentProperty()を使用して、サーバー上の制御記述子にプロパティを登録できます。これにより、親コントロールが初期化される前に、すべての子コントロールが確実に初期化されます。

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

次に、クライアント側のプロパティ「childControl」を作成する限り、自動的に初期化され、親コントロールの init() メソッド内で使用できるようになります。

于 2010-05-14T13:35:06.540 に答える