تحذير Flex: غير قادر على ربط الممتلكات "فو" على كائن "كائن" (فئة ليست iEventDispatcher)

StackOverflow https://stackoverflow.com/questions/928081

سؤال

لدي كائن يحتوي على دزينة أو نحو ذلك الحقول التي أرغب في ربط العناصر النموذجية، بحيث يمكنني استخدام هذا الكائن لإرسال البيانات مرة أخرى إلى الخادم المراد حفظها.

تعريف كائن الحاوية الخاص بي:

private static const emptyLink:Object = {
    id: -1, title:'',
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'',
    linkTitle:'', linkBody:'',
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:''
};

[Bindable] public var currentLink:Object = emptyLink;

currentLink يتم تعيينه في وقت التشغيل إلى مؤشر محدد من ArrayCollection، أنا فقط باستخدام emptyLink كائن لأغراض التهيئة، ومعظمهم.

<mx:Panel id="triggerPanel" title="Trigger" width="33%">
    <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
        <mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" />
        <mx:TextInput id="trigger2" width="100%" textAlign="left" text="{currentLink.trigger2}" />
        <mx:TextInput id="trigger3" width="100%" textAlign="left" text="{currentLink.trigger3}" />
        <mx:TextInput id="trigger4" width="100%" textAlign="left" text="{currentLink.trigger4}" />
        <mx:TextInput id="trigger5" width="100%" textAlign="left" text="{currentLink.trigger5}" />
    </mx:VBox>
</mx:Panel>

بالطبع، هذا يجمع ويعرض بشكل جيد فقط، ولكن هناك تحذيرات وقت التشغيل لكل مثيل:

تحذير: غير قادر على ربط الممتلكات "TRIGGER1" على "كائن" (فئة "(فئة ليست جهاز iEventDispatcher) تحذير: غير قادر على الربط إلى الخصائص" TRIGGER2 "على كائن" كائن "(فئة ليست IEVentDispatcher) تحذير: غير قادر على الربط خاصية "Trigger3" On Class "كائن" (فئة ليست أداة تحذير iEventDispatcher) "الكائن" (فئة ليست iEventDispatcher)

و ال currentLink لم يتم تحديث الكائن عند TextInput يتم تغيير الحقول.

الجواب الواضح هو أن كائني يحتاج إلى أن يكون مثالا للفئة التي تنفذ IEventDispatcher. وبعد ما هي الإجابة التي لا تخبرني أنها تفاصيل تنفيذ هذه الواجهة (ما هو مطلوب؟ ما ليس؟)، وإذا كانت هناك طريقة أبسط للقيام بذلك - مثل فئة مدمجة ستقبل بكل سرور خصائص المخصصة الخاصة بي للربط، بدون لي الاضطر بالقلق بشأن تفاصيل تنفيذ الواجهة.

هل هذه الفئة موجودة؟ إذا لم يكن الأمر كذلك، فما هو الحد الأدنى والمعيار المعياري المقبول لإنجاز هذه المهمة؟

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

المحلول

تحتاج إلى استخدام ObjectProxy (كما يذكر الشيتان) - لكنك تحتاج أيضا إلى استخدام Valuecommit للحصول على النص الذي تدخله في الإدخال مرة أخرى في كائنك:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.utils.ObjectProxy;
              private static const emptyLink:Object = {
    id: -1, title:'',
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'',
    linkTitle:'', linkBody:'',
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:''
};

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink);


private function handleClick():void
{
    trace(currentLink.trigger1);
}
]]>
</mx:Script>

<mx:Panel id="triggerPanel" title="Trigger" width="33%">
        <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
                <mx:TextInput  id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" valueCommit="{currentLink.trigger1 = trigger1.text;}"/>

                <mx:Button label="Click" click="handleClick()"/>
        </mx:VBox>
</mx:Panel>        

</mx:WindowedApplication>

نصائح أخرى

Object لا ترسل الأحداث. على الرغم من أنك جعلت المتغيرات القابلة للتغيير، فإن خصائص الكائن المشار إليها بواسطة المتغير currentLink لا يمكن أن تكون ملزمة.

يستخدم ObjectProxy في حين أن.

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink);

أول شيء تريد أن تعرفه هو أن الربط في المرن 3 غير ثنائي الاتجاه. سيضمن التعبير الملزم أنه إذا كان مصدر التعبير الملزم (Currentlink.trigger1) يتغير أن الهدف (TextInput) سيحصل على إشعار بالتغيير والتحديث وفقا لذلك. إذا كنت تريد ربط الربط في الاتجاه الآخر، فهناك طريقتين على الأقل للقيام بذلك:

  1. استخدم MX: علامة ملزمة لتوجيه Textinput.Text مرة أخرى إلى الكائن
  2. استخدم BindingUtils للقيام بهذا برمجيا بدلا من ذلك.

في Flex 4، يقدمون بناء جملة جديد لملزمة ثنائية الاتجاه @ {some.binding.expression} لكنه غير متوفر باللغة المرن 3.

في الجزء الثاني: الخطأ الذي تتلقاه هو أن تكون ملزما كائن نموذج أولي "عام". عند تطبيق علامة البيانات الوصفية [Bindable] إلى خاصية أو فئة، ينشئ برنامج التحويل البرمجي MXMLC كصنونة يتضمن استخدام الأدوات المساعدة الملزمة ومشاهدات تغيير الممتلكات للقيام بتحدث الربط. ومع ذلك، لا يمكنك جعل كائن النموذج الأولي القيام بذلك لأنه مدمج. يمكنك إنشاء فئة ActionScript مخصصة والتي تكون قابلة للتغذية (أو لديها خصائص معينة). سيقوم برنامج التحويل البرمجي MXMLC بإنشاء فئة تقوم بتنفيذ IEVENTDISPatcher وبالتالي يدعم الربط. يحتوي هذا على ميزة كونه أسرع من كائنات النموذج الأولي وأعطيك أيضا فحص وقت الترجمة، أي سوف تتلقى خطأ مترجم إذا قمت بالرجوع إلى خاصية غير صالحة.

البديل الآخر هو التفاف النموذج الأولي الخاص بك في ObjectProxy كأحد آخر، لذلك اقترح الأعضاء.

مجرد نصيحة حول كيفية معرفة الرمز المخالف في مشروع أكبر - ضع نقطة توقف على الاثنين

trace("warning: unable to bind to property '"

خطوط في فئة PropertyWatcher في SDK (التنقل> فتح النوع> ...). ستساعدك StackTrace ثم في العثور على مكون UI الذي يحمل الربط المكسور.

بشكل عام، السبب وراء الحصول على "غير قادر على ربط الممتلكات فو على فئة، هو ل أنت إما في عداد المفقودين getter أو sedter for foo. وبعد أنت استطاع أيضا جعل foo scoped إلى متغير عام، (على الرغم من أن هذا يكسر التغليف)

لذلك تحتاج إلى كل من هذه لجعل الأمر يزول

public function set foo (o:FooObject) : void {
...
}

أو

public function get foo() : FooObject {
...
}

إليك مرجع Livedocs للواجهة. انها إلى حد كبير ما سيكون واضحا.

يقتبس:

بشكل عام، فإن أسهل طريقة لفئة محددة من قبل المستخدمين للحصول على إمكانيات إرسال الأحداث هي تمديد EventDispatcher.

لذلك،

ثابت ثابت const apperylink: eventdispatcher = {

لم أستخدم المرن لفترة طويلة جدا، وقد لا يناسب ذلك متطلباتك، ولكن لماذا لا تستخدم XML؟ أعتقد أنه يمكنك ضبط قيمة نص TextInput على السمات الموجودة في XML.

أنا أستخدم الكود الزائف، ولكن شيء من هذا القبيل منطقيا بالنسبة لي:

[Bindable] private static const currentLink:XML = <root>
                                                    <trigger1 value=""/>
                                                    <trigger2 value="" />
                                                  </root>;
...
<mx:TextInput id="trigger1" width ... text="{currentLink.trigger1.@value}" />

شيء من هذا القبيل، ربما؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top