ASP.Net ScriptControl-別のメソッドを呼び出す
-
03-07-2019 - |
質問
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から同じメソッドを呼び出すことはできませんオブジェクト。メモリ内のクラス設計(?)が既存のメソッドを認識し、そのクラスからインスタンス化されたオブジェクトも認識する場合、あなたは思うでしょう。
解決
クライアントでは、_childControlIDと呼ばれる親コントロールオブジェクトのフィールドを$ getに渡すことで使用しています。これにはいくつかの問題があります:
- _childControlIDはどのように設定されましたか?サーバー上の親コントロールの記述子にプロパティとして追加すると推測されますが、そのコードは表示されず、クライアント側の親コントロールクラスにはプロパティが表示されません。
- $ getは、コントロールではなく要素参照を返します。したがって、_childControlIDが有効な要素IDに設定されていても、その要素にはCallMethodというメソッドがありません。クライアント側の子コントロールクラスが親コントロールの前に初期化された場合、要素には" control"というフィールドがあります。 「添付」したスクリプトコントロールにアクセスするために使用できます。それ自体を要素に。もちろん、これは子コントロールが親コントロールの前に初期化された場合にのみ機能します。
他のヒント
問題は「これ」です。これは、javaScriptでは、DOMオブジェクトを指します。 Function.createDelegateを使用する場合と同様の処理を行う必要があります。これは、$ addHandlerを使用するときに必要です(使用していないことを知っているだけで、コンテキストを提供します)。
いくつかのオプションがあります。
-
$ find()を使用して、子スクリプトコントロールを見つけることができます。ただし、子コントロールの前に親コントロールが初期化されるリスクに直面します。
this._childControl = $find(this._childControlID); this._childControl.CallMethod();
-
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 }; } }
その後、クライアント側のプロパティ&quot; childControl&quot;を作成する限り、自動的に初期化され、親コントロールのinit()メソッド内で使用できるようになります。