2009-09-08 2 views
0

В моем приложении flex у меня есть общедоступное свойство связывания. Я хочу, чтобы каждый раз, когда значение этого свойства изменяется, функция запускается. Я попытался использовать ChangeWatchers, но похоже, что они применимы только к встроенным компонентам, таким как изменение текстового поля. Я хотел бы сделать то же поведение с свойством, которое изменяется во время выполнения.Просмотр связанного свойства

ответ

2

Одним из вариантов является использование BindingUtils.bindSetter (который, кстати, возвращает ChangeWatcher):

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="this_creationComplete()"> 

    <mx:Script> 
     <![CDATA[ 

      import mx.binding.utils.BindingUtils; 
      import mx.binding.utils.ChangeWatcher; 

      [Bindable] 
      public var myValue:int = 0; 

      private function this_creationComplete():void 
      { 
       var cw:ChangeWatcher = BindingUtils.bindSetter(myValueChanged, this, "myValue"); 
      } 

      private function setValue():void 
      { 
       myValue = getTimer(); 
      } 

      private function myValueChanged(o:Object):void 
      { 
       trace("myValue: " + myValue.toString()); 

       // You can also use o.toString() -- the new value will be passed into the function 
      } 

     ]]> 
    </mx:Script> 


    <mx:Button label="Click Me" click="setValue()" /> 

</mx:Application> 

Здесь myValueChanged вызывается всякий раз, когда myValue изменения свойств. Конечно, есть и другие способы, но я часто использую этот подход с хорошими результатами. Надеюсь, поможет! Отправьте обратно с вопросами, и я буду следить.

0

ну, самый простой способ - прослушать PropertyChangeEvent.PROPERTY_CHANGE ... если вы объявите свойство связующим, то mxmlc генерирует код для отправки этого события ... если вы позволите компилятору сохранить сгенерированный ActionScript, тогда вы будете увидеть ...

кроме этого, вы можете захотеть взглянуть на BindingUtils ...

0

Посмотрите в класс BindUtils как предполагает back2dos.

И, кроме того, вы можете установить имя события, которое будет срабатывать при изменении делается для свойства (по умолчанию propertyChange), как это:

[Bindable("change")] 
var myProperty : SomeClass; 

То есть, если ChangeWatchers добавляет слушатели для событие изменения вместо события propertyChange. Который был бы странным, но не невозможным со всеми неудачами SDK flex.

Но опять же, я думаю, что класс BindUtils должен сделать трюк для вас.

0

Используйте класс ObjectProxy или его подкласс и завершите класс, у которого есть свойство, которое вам нужно посмотреть. В моем примере, я звоню FUNC, если кто-то изменить свойство зарплаты, придавая ему значение больше 55000 в объекте Person:

пакет com.farata { импорт mx.utils.ObjectProxy; импорт flash.utils. *;

использование пространства имен flash_proxy;

public dynamic class MyPersonProxy extends ObjectProxy 
{ 
// The object to wrap up 
private var person:Person; 

    public function MyPersonProxy(item:Person){ 
     super(item); 
     person=item; 
    } 

    flash_proxy override function setProperty(name:*, value:*):void { 

если (имя == «зарплата» & & значение> 55000) {// добавить новое свойство к этому экземпляру // класса Человек, который может быть использован в расчетах // от общей компенсации setProperty («пенсия», 0,02); } super.setProperty (имя, значение);
} } }

Смежные вопросы