Запись функции внутри атрибута в flex

#apache-flex #function #actionscript #attributes

#apache-flex #функция #actionscript #атрибуты

Вопрос:

Могу ли я написать функцию внутри атрибута в flex? Что-то вроде этого:

 <s:Button id="btn" label="text" visible="{foo()}"/>
private function foo():Boolean
{
  //do something
}
  

Кажется, это не работает, по крайней мере, для меня.
Я знаю, что я могу написать как visible="{something == true amp;amp;amp;amp; somethingElse == false}" и т.д. Но мне нужно, чтобы это больше походило на for циклы и т.д.

Комментарии:

1. Вы пытались сделать это, используя замыкания внутри вашей привязки?

2. Я не уверен, что я вполне понимаю, о чем вы спрашиваете

Ответ №1:

Попробуйте это:

 [Bindable(event="update")]
private function foo():Boolean
{
   return a amp;amp; b amp;amp; c;
}
  

и когда a, b или c меняются, просто сделайте это:

 dispatchEven(new Event("update"));
  

Ответ №2:

Эта реализация не привязывается — если результат foo() изменится, он не будет отражен в вашем списке отображения.

Хотя, я думаю, это должно сработать сразу после завершения создания:

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="955"
               minHeight="600">

    <fx:Script>
        <![CDATA[
            private function foo():Boolean
            {
                return false;
            }
        ]]>
    </fx:Script>

    <s:Button label="text"
              visible="{foo()}" />

</s:Application>
  

Лучшим подходом было бы включить модель представления, используя привязку, как показано здесь:

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="955"
               minHeight="600"
               creationComplete="creationCompleteHandler(event)">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            [Bindable]
            public var presentationVisible:Boolean = true;

            private var timer:Timer = new Timer(500);

            private function foo():void
            {
                presentationVisible = Math.random() > 0.5 ? true : false;
            }

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                timer.addEventListener(TimerEvent.TIMER, timerHandler);
                timer.start();
            }

            protected function timerHandler(event:TimerEvent):void
            {
                foo();
            }
        ]]>
    </fx:Script>

    <s:Button label="text"
              visible="{presentationVisible}" />

</s:Application>