Архів для категорії ‘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[
      1. 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>