Архів для категорії ‘Flex Framework 3’

Метагег [MIXIN] во Flex

четверг, март 27, 2008

Если Вы вставите метатег [MIXIN] в Вашем классе (чуть выше определения класса), то при старте Flex-аппликухи будет запущена статическая функция init():

  1. public static function init(root:DisplayObject):void

А запустит её SystemManager.

В помощи Flex есть упоминания про этот метатег, найти их можна выполнив поиск по слову mixin :)

Напильник для Flex: mx_internal

пятница, март 7, 2008

Адобовцы довольно часто используют namespace mx_internal для внутреннего общения между компонентами. Но и нам, иногда, полезно поиспользовать этот namespace. Например, нам нужно в Button.label отобразить html-текст.

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”vertical”>
    1. <mx:Button id=”helloB” label=”Hello World!”/>
    1. <mx:creationComplete>
      1. <![CDATA[
      1. helloB.getTextField().htmlText = “<u><i>H</i>ello World!</u>”;
      1. // если бы мы не применили бы namespace то можно было бы написать так:
      1. // helloB.mx_internal::getTextField().htmlText = “<u><i>H</i>ello World!</u>”;
      1. ]]>
    1. </mx:creationComplete>
    1. <mx:Script>
      1. <![CDATA[
      2. import mx.core.mx_internal; // импотируем namespace
      1. use namespace mx_internal; // применяем его
      1. ]]>
    1. </mx:Script>
  3. </mx:Application>

Но это нужно использовать крайне осторожно, т.к. очень легко поламать компонентину (т.к. запуск подобного метода выбивается из цикла жизни компонента) или просто при следующем обновлении компонент просто переопределит то, что Вы задали в значение, которое было до использования метода.

Використання убудованих namespace-ів

суббота, март 1, 2008
private function trace(…args):void
{
	args.push(” - Custom Trace”);
	public::trace.apply(null, args);
}

Якщо ми запустимо
trace("Hello!");
в output отримаємо
Hello! - Custom Trace

Наш метод trace має буди у будь-якому namespace крім public. Інакше буде Stack overflow Error.

Логічніше було-б використовувати namespace native, але він також не дає змогу використовувати public та іще видає Internal build error, якщо не написати так:
native::["trace"]["apply"](null, args);

[Flex 3] PopUpButton.closeOnActivity

четверг, февраль 28, 2008

У Flex є такий компонент PopUpButton. Поведінка його схожа на ComboBox, тільки ми маємо можливість задати будь-який компонент який відкриється при натисканні. Але маємо неприємність з тим, що при натисканні на щойно відкритий компонент він зразу зачиняється. Тобто ми не можемо використовувати, наприклад, List з встановленим allowMultipleSelection=true та вибрати декілька елементів в List. У компонента PopUpButton є потрібна нам властивість:

/**
*  @private
*  Storage for the closeOnActivity property.
*/
private var _closeOnActivity:Boolean = true;

/**
*  @private
*  Specifies popUp would close on click/enter activity.
*  In popUps like Menu/List/TileList etc, one need not change
*  this as they should close on activity. However for multiple
*  selection, and other popUp, this can be set to false, to
*  prevent the popUp from closing on activity.
*
*  @default true
*/
private function get closeOnActivity():Boolean
{
	// We are not exposing this property for now, until the need arises.
	return _closeOnActivity;
}

/**
*  @private
*/
private function set closeOnActivity(value:Boolean):void
{
	_closeOnActivity = value;
}

Але як бачите вона є private :)

Рішення:

Потрібно зупинити всі MouseEvent.Click від нашого PopUp’у :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
	<mx:PopUpButton>
		<mx:popUp>
			<mx:List id="list" allowMultipleSelection="true">
				<mx:dataProvider>
					<mx:Array>
						<mx:String>Один</mx:String>
						<mx:String>Два</mx:String>
						<mx:String>Три</mx:String>
						<mx:String>Чотири</mx:String>
						<mx:String>П'ять</mx:String>
					</mx:Array>
				</mx:dataProvider>
			</mx:List>
		</mx:popUp>
	</mx:PopUpButton>
	<mx:creationComplete>
		<![CDATA[
			list.addEventListener(MouseEvent.CLICK, listClickHandler, true);
		]]>
	</mx:creationComplete>
	<mx:Script>
		<![CDATA[
			private function listClickHandler(event:MouseEvent):void
			{
				event.stopImmediatePropagation();
			}
		]]>
	</mx:Script>
</mx:Application>