مشكلة ربط البيانات في اتجاهين
-
26-12-2019 - |
سؤال
إليك رمز المكون الخاص بي:
<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="950" height="50" creationComplete="this_creationCompleteHandler(event)"
currentState="default" enabled="{currentBox!=null}">
<s:states>
<s:State name="default"/>
<s:State name="boxSelected" stateGroups="admin"/>
<s:State name="textBoxSelected" stateGroups="user"/>
<s:State name="imageBoxSelected" stateGroups="user"/>
</s:states>
<s:layout>
<s:HorizontalLayout gap="10" horizontalAlign="left" paddingBottom="10" paddingLeft="10"
paddingRight="10" paddingTop="10" verticalAlign="middle"/>
</s:layout>
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
public var model:Model;
private var _currentBox:Box = null;
[Bindable]
public function set currentBox(box:Box):void
{
_currentBox = box;
if(model.userType == Model.USER_TYPE_ADMIN)
currentState = "boxSelected";
else if(box is TextBox)
currentState = "textBoxSelected";
else if(box is ImageBox)
currentState = "imageBoxSelected";
else
currentState = "default";
}
public function get currentBox():Box
{
return _currentBox;
}
protected function this_creationCompleteHandler(event:FlexEvent):void
{
AppEventBus.instance.addListener(AppEvent.BOX_SELECTED, boxSelectedHandler);
AppEventBus.instance.addListener(AppEvent.PAGE_SELECTED, pageSelectedhandler);
}
protected function boxSelectedHandler(event:AppEvent):void
{
currentBox = event.data as Box;
}
protected function pageSelectedhandler(event:AppEvent):void
{
currentBox = null;
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:ToggleButton id="secureLockButton" includeIn="admin, user" width="20" height="20"
selected="@{currentBox.secured}"
styleName="secureButtonStyle"/>
<s:DropDownList id="fontsList" includeIn="textBoxSelected" width="150" height="20"
selectedItem="@{(currentBox as TextBox).font}"
dataProvider="{(currentBox as TextBox).fonts}"/>
<s:DropDownList id="fontSizesList" includeIn="textBoxSelected" width="60" height="20"
selectedItem="@{(currentBox as TextBox).fontSize}"
dataProvider="{(currentBox as TextBox).fontSizes}"/>
<s:DropDownList id="boxTypes" includeIn="boxSelected" width="70" height="20"
dataProvider="{Box.BOX_TYPES}" selectedItem="{currentBox.boxType}"/>
<s:TextInput id="boxName" includeIn="boxSelected" width="70" height="20"
text="@{currentBox.name}"/>
</s:BorderContainer>
Box
الطبقة لها ورثتان: TextBox
و ImageBox
.كل هذه الفئات هي [Bindable]
.في المكون الآخر اخترت Box
اعترض وأبلغ عن هذا الحدث المكون أعلاه EventBus
.أنا أيضا استخدامه لتمرير المحدد Box
هدف.كل TextBox
الكائن لديه ArrayCollection
أحجام الخطوط المتاحة (الخطوط) وواحدة مختارة.أريد ربط بلدي DropDownList
لهذه القيم بطريقتين.لذا DropDownList
يعرض دائمًا حجم الخط (الخط) المحدد حاليًا للمربع وإذا حدد المستخدم قيمة أخرى من القائمة، فسيتم تعيينها على القيمة الحالية TextBox
هدف.
عندما أقوم بتحديد كائن TextBox لأول مرة، كل شيء يعمل بشكل جيد ولكن عندما أقوم بتحديد كائن آخر أحصل على الخطأ:
خطأ في النطاق:قيمة Fontsize Value 0 خارج النطاق في flashx.textlayout.property::property$/defaulterrorhandler () [c: vellum branses v2 2.0 dev output opensource textlayout src flashx textlayout property property property.as:31] في flashx.textlayout.property::property/Sethelper() Budapc:VellumBranchessiteRslev222.0devitputourceourceourceTomeOutsLayoutsitrcflashStrayoutsureTorty.as.AS : 230] في flashx.textlayout.formats :: textlayoutformat/setStyleByProperty () [c: vellum branches v2 2.0 dev output opensource textlayout src flashx textlayout textlayoutformat.as: 628] في flashx.textlayout.formats :: textlayoutformat/set fontsize () [c: vellum branches v2 2.0 dev output opensource textlayout src flashx textlayout tormats textlayoutformat.as: 1044] .core :: csStextLayoutFormat () [e: dev 4.y frameworks projects spark src Spark core csstextlayoutformat.as: 75] في Spark.components :: RicheditableText/updateStylesifchang () [ dev 4.y frameworks projects Spark src Spark Components RichedItableText.as: 3649] في Spark.components :: RicheditableText/CommiceProperties () [E: dev 4.y frameworks projects spark src Spark Components richeditabletext.as: 2509] في mx.core :: uicomponent/validateproperties () [e: dev 4.y frameworks projects framework src mx core uicomponent.as: 8219] في mx.managers :: layoutmanager/validateproperties () [e: dev 4.y frameworks project () [e: dev 4.y frameworks projects framework src mx managers layoutmanager.as: 813] في mx.managers :: layoutManager/dophassantantiationCallback () [e: dev 4.y Frameworks Projects Framework Src Mx Managers LayoutManager.as: 1180
بطريقة ما selectedValue
ممتلكات DropDownList
يصبح 0.ما الخطأ الذي افعله؟
المحلول
ليس من السهل رؤية ما يحدث "تحت الغطاء" دون تصحيح أخطاء هذا التطبيق الفعلي.يمكنك تتبع جميع أدوات الضبط بنفسك لمعرفة الترتيب الذي تحدث به bindibgs.
لأن ما يمكن أن يحدث في رأيي هو أن الارتباطين (selectedItem وdataProvider) - ليسا متزامنين كما تريد.أنت لا تعرف أبدًا أيهما سيحدث أولاً، والأهم من ذلك، ما يحدث داخل قائمة drpdownlist عندما تقوم بتعيين أحدهما.والنتيجة هي أنه في نقطة واحدة، يؤدي الربط ثنائي الاتجاه إلى إعادة تحديد العنصر الذي يكون فارغًا في تلك اللحظة ويعين 0 على حجم الخط (لأن الرقم (فارغ) هو 0).وهذا 0 يؤدي إلى هذا الخطأ الذي يحدث في مكان آخر.
ما عليك سوى تجربة ما تم تعيينه فعليًا في أداة ضبط حجم الخط (ضع أثرًا فيه) للبدء.
كما تعلم، نظرًا لأن الربط ثنائي الاتجاه يبدو فكرة جيدة، فقد انتهيت دائمًا إلى "الربط الكلاسيكي" مع التعامل مع حدث التغيير (الرجوع إلى معالج الحدث هذا).لقد واجهنا دائمًا بعض المشكلات المشابهة لهذه المشكلة عند استخدام الربط ثنائي الاتجاه.