Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.01.2014, 17:02
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 1  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
По умолчанию Проблема с two-way data binding.

Код моего компонента:
Код AS3:
<?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 есть 2 потомка: ImageBox и TextBox. Все эти классы отмечены [Bindable] тегом. Где-то в другой части приложения я выбираю эти самые "боксы" и сообщаю об этом своему компоненты с помощью шины событий (так же передаю и сам Box-объект). У класса TextBox есть список доступных размеров шрифта и выбранный размер (аналогично есть список доступных шрифтов и выбранный шрифт). Я хочу связать эти списки и выбранное значение с List компонентами, так, чтобы выбранное значение в списке сразу же устанавливалось в моем Box объекте.

Когда я выбираю TextBox в первый раз, все работает. Но стоит мне сменить TextBox на другой, то я получаю ошибку:

Код:
RangeError: Property fontSize value 0 is out of range
	at flashx.textLayout.property::Property$/defaultErrorHandler()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\property\Property.as:31]
	at flashx.textLayout.property::Property/setHelper()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\property\Property.as:230]
	at flashx.textLayout.formats::TextLayoutFormat/setStyleByProperty()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\formats\TextLayoutFormat.as:628]
	at flashx.textLayout.formats::TextLayoutFormat/set fontSize()[C:\Vellum\branches\v2\2.0\dev\output\openSource\textLayout\src\flashx\textLayout\formats\TextLayoutFormat.as:1044]
	at spark.core::CSSTextLayoutFormat()[E:\dev\4.y\frameworks\projects\spark\src\spark\core\CSSTextLayoutFormat.as:75]
	at spark.components::RichEditableText/updateStylesIfChanged()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\RichEditableText.as:3649]
	at spark.components::RichEditableText/commitProperties()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\RichEditableText.as:2509]
	at mx.core::UIComponent/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:8219]
	at mx.managers::LayoutManager/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
	at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:813]
	at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]
Каким-то образом selectedValue оказывается 0. Похоже, что байндинг работает не так, как я того ожидаю. Как можно исправить эту проблему?

P.S. Ради интереса убрал two-way binding. В результате selectedValue компонентом List подхватывается через раз еще и не правильно.

Старый 22.01.2014, 04:58
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 2  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
вроде код есть, пояснения есть, а ваще непонятно

Старый 22.01.2014, 13:18
Sonet вне форума Посмотреть профиль Отправить личное сообщение для Sonet Найти все сообщения от Sonet
  № 3  
Ответить с цитированием
Sonet

Регистрация: Apr 2012
Сообщений: 44
Пришлось отказаться от затей использовать 2-way data binding. Судя по всему там сеттеры вызываются не в том порядке, в котором я рассчитывал)

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:08.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.