以下の単純化された例
オブジェクト (Person) が変更されたときに対応する必要がある 2 つのビジュアル コンポーネント (PersonPicker と PersonViewer) があります。
そのコンポーネントの人物の値が変更されても、PersonViewer のセッターは明らかに呼び出されません。個人の価値が変わると、別の関数 (calculateSalary) を呼び出す必要があるため、これが必要です。
この関数は最初は正しく呼び出されますが、PersonPicker で人物を変更すると、setter が呼び出されなくなり、給与ラベルが初期値のままになります。
人物クラス
package
{
[Bindable]
public class Person
{
private var _name:String;
public function Person()
{
}
public function get name():String
{
return _name;
}
public function set name(value:String):void
{
_name = value;
}
}
}
主な用途
<?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" xmlns:local="*"
creationComplete="creationCompleteHandler(event)">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import mx.binding.utils.BindingUtils;
import mx.events.FlexEvent;
protected function creationCompleteHandler(event:FlexEvent):void
{
// Bind the person property of the personPicker to the person property of the personViewer
BindingUtils.bindProperty(personViewer, "person", personPicker, "person");
// Create a new Person and set this as the PersonPicker's person
var john:Person = new Person();
john.name = "John";
personPicker.person = john;
}
]]>
</fx:Script>
<local:PersonPicker id="personPicker"/>
<local:PersonViewer id="personViewer"/>
</s:Application>
パーソンピッカー
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="100%" height="100">
<fx:Script>
<![CDATA[
private var _person:Person;
[Bindable]
public function get person():Person
{
return _person;
}
public function set person(value:Person):void
{
_person = value;
}
]]>
</fx:Script>
<s:DropDownList selectedItem="@{person.name}">
<mx:ArrayCollection>
<fx:String>Phil</fx:String>
<fx:String>Bill</fx:String>
<fx:String>John</fx:String>
<fx:String>Mike</fx:String>
</mx:ArrayCollection>
</s:DropDownList>
</s:Group>
人物閲覧者
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100">
<fx:Script>
<![CDATA[
private var _person:Person;
[Bindable]
public function get person():Person
{
return _person;
}
public function set person(value:Person):void
{
trace ("set person()");
_person = value;
calculateSalary();
}
private function calculateSalary():void
{
trace ("calculateSalary()");
switch (person.name)
{
case "Phil":
salary.text = "1000";
break;
case "Bill":
salary.text = "1200";
break;
case "John":
salary.text = "1400";
break;
case "Mike":
salary.text = "1600";
}
}
]]>
</fx:Script>
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<s:Label text="{person.name}"/>
<s:Label id="salary"/>
</s:Group>
これは、Person オブジェクトのプロパティ 'name' のみを変更することと関係があると思います。これにより、setter が呼び出されません。これは正しいですか? もしそうなら、どうすれば私の例を修正できますか?