سؤال

أقول لدي اثنين النصي ضوابط تحكم واحد الأخرى كما الطفل التحكم:

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 يمكن أن نرى ذلك ؟

التحديث هل من الممكن أن "نوع" هذا._childControl?

هنا هو السبب أنا أسأل...عند استخدام ووتش النظام يعرف ما ChildControl الطبقة ، وأستطيع أن أساليب الدعوة من الطبقة نفسها, ومع ذلك, لا يمكن استدعاء نفس الأساليب من هذا._childControl الكائن.كنت أعتقد أنه إذا كان تصميم الطبقة (?) في ذكرى تسلم الأسلوب القائمة و إنشاء مثيل كائن من تلك الفئة أيضا.

هل كانت مفيدة؟

المحلول

على العميل ، كنت تستخدم مجال والديك السيطرة على كائن يسمى _childControlID بتمريرها إلى $تحصل.هناك عدد قليل من المشاكل مع هذا:

  1. كيف _childControlID الحصول على مجموعة ؟ اعتقد عن طريق إضافة على أنها عقار في الأصل التحكم واصف على الملقم ولكن لا تظهر ذلك القانون و لا تظهر الممتلكات من جانب العميل الوالدين السيطرة على الصف.
  2. $الحصول على عوائد عنصر المراجع-لا ضوابط.حتى لو _childControlID تم تعيين صالح معرف عنصر, هذا العنصر لن يكون طريقة تسمى CallMethod.إذا كان العميل الطفل التحكم في الدرجة هل تهيئة قبل الوالدين مراقبة عنصر حقل يسمى "السيطرة" التي يمكنك استخدامها للوصول إلى تحكم البرنامج النصي أن "تعلق" في حد ذاته عنصر.هذا يعمل فقط إذا كان الطفل التحكم في تهيئة قبل الوالدين التحكم بالطبع.

نصائح أخرى

المشكلة هو "هذا". هذا في جافا سكريبت ، يشير إلى كائن DOM.تحتاج إلى القيام بشيء مماثل لما يحدث عند استخدام وظيفة.createDelegate ، وهو مطلوب عند استخدام $addHandler (التي أعلم أنك لا تستخدم فقط إعطاء السياق).

لديك عدة خيارات.

  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