#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>