Як зрозуміти, що подія виконалась саме на передплатнику?

Tuesday, March 11, 2008

Іноді нам потрібно знати чи подія виконалась на передплатнику чи прийшло внаслідок bubbling. Наприклад, нам потрібно відслідкувати натискання миші на stage, але нам потрібно знати напевно, що користувач натиснув саме на stage, а не на його child. Авжеж, ми можемо зробити

stage.mouseChildren = false;

але це частіше всього не підходить.

Можна зробити двома рівносильними способами.

В обробнику для stage виконаємо перевірку на рівність event.target з event.currentTarget:

  1. function stageClickHandler(event:MouseEvent):void
  2. {
    1. if(event.target != event.currentTarget)
      1. return;
    1. // Your code here
  3. }

Або перевіримо яка наразі фаза event flow. Якщо вона дорівнює 2 (target phase), тоді подія виконалась саме на stage. Інакше припиняємо виконання обробника:

  1. function stageClickHandler(event:MouseEvent):void
  2. {
    1. if(event.eventPhase != 2)
      1. return;
    1. // Your code here
  3. }

Докладніше про подійну модель в ActionScript 3.0 ви можете почитати у доповіді Кості Ковальова (російською).

[MXML] Як зробити setter, який приймає числове значення та значення у відсотках?

Monday, March 10, 2008

Ви ніколи не замислювались як може setter (в mxml), наприклад width, який повинен приймати Number, може приймати значення виду ’50%’?

Насправді все дуже просто. Існує метатаґ [PercentProxy], який як параметр приймає ім’я методу, який буде задіяно, якщо значення буде задано у відсотках.

Приклад. Створимо клас FleasCatcher:

  1. package
  2. {
    1. import mx.containers.Canvas;
    1. public class FleasCatcher extends Canvas
    1. {
      1. [PercentProxy("percentFleasCountInMyHead")]
      1. public function set fleasCountInMyHead(value:Number):void
      1. {
        1. trace(“number: “+value);
      1. }
      1. public function set percentFleasCountInMyHead(value:Number):void
      1. {
        1. trace(“percent: “+value);
      1. }
    1. }
  3. }

Тепер можемо написати хоч так:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:local=”*”>
    1. <local:FleasCatcher fleasCountInMyHead=”1000” />
  3. </mx:Application>

Хоч так:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:local=”*”>
    1. <local:FleasCatcher fleasCountInMyHead=”99%” />
  3. </mx:Application>

Напилок для Flex: mx_internal

Friday, March 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>

Але це треба використовувати дуже обережно, т.я. дуже легко зламати компонент (тому що запуск подібного методу не буде входити в життєвий цикл компонента) або при наступному оновленні, компонент верне усі задані значення до тих які були перед використанням напилку.

flash.events.IOErrorEvent.id?

Thursday, March 6, 2008

Невеличка помилка у допомозі Flex Builder 3. Там сказано, що у IOErrorEvent є властивість id:

id:int (default = 0) — A reference number to associate with the specific error.

Також є такий самий параметр у конструкторі:

public function IOErrorEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, text:String = "", id:int = 0)

Але насправді ніякого id немає. Це підтверджують тести та локальна допомога Flash CS3 (але на liveDocs для Flash CS3 теж помилка ).
Чи може я помиляюсь?

Загадка про Date

Wednesday, March 5, 2008
trace( Date( new Date() ) is Date );

Що буде в output?

Далі відповідь

Читати далі »