문제

두 개의 스크립트 컨트롤이 있고 하나의 컨트롤이 다른 컨트롤을 어린이 컨트롤로 사용한다고 가정 해 보겠습니다.

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

문제는 내가 시도 할 때 마다이 방법을 찾거나 지원하지 않는다는 것입니다. Child Control의 모든 방법이 Parent Control에 의해 액세스 할 수 없습니까?

학부모 구성이 볼 수 있도록 방법을 공개 할 수있는 방법이 있습니까?

업데이트this._childcontrol을 "입력"할 수 있습니까?

내가 묻는 이유는 다음과 같습니다. Watch를 사용할 때 시스템은 자식 컨트롤 클래스가 무엇인지 알고 있으며 클래스 자체에서 메소드를 호출 할 수 있지만 this._childcontrol 객체에서 동일한 메소드를 호출 할 수 없습니다. 메모리의 클래스 디자인 (?)이 기존의 방법을 인식하고 해당 클래스에서 인스턴스화 된 객체도 인식한다고 생각할 것입니다.

도움이 되었습니까?

해결책

클라이언트에서는 $ get에 전달하여 _childcontrolid라는 부모 제어 객체의 필드를 사용하고 있습니다. 이것에 몇 가지 문제가 있습니다.

  1. _childcontrolid는 어떻게 설정 되었습니까? 서버의 상위 제어의 디스크립터에 속성으로 추가함으로써 추측하지만 해당 코드를 표시하지 않으며 클라이언트 측 상위 제어 클래스에 속성이 표시되지 않습니다.
  2. $ 컨트롤이 아닌 요소 참조를 반환합니다. 따라서 _childControlID가 유효한 요소 ID로 설정되어 있더라도 해당 요소에는 CallMethod라는 메소드가 없습니다. 클라이언트 측 아동 제어 클래스가 상위 제어 전에 초기화 된 경우 요소는 요소에 "첨부 된"스크립트 컨트롤에 액세스하는 데 사용할 수있는 "컨트롤"이라는 필드를 갖습니다. 물론 아동 통제가 부모 통제 전에 초기화 된 경우에만 작동합니다.

다른 팁

문제는 "이것"입니다. 이것은 JavaScript에서 DOM 객체를 나타냅니다. function.createdElegate를 사용할 때 발생하는 것과 유사한 일을해야합니다.

몇 가지 옵션이 있습니다.

  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 () 메소드 내에서 자동으로 초기화되고 사용할 준비가됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top