Flex ChangeWatcher не работает - PullRequest
1 голос
/ 09 июля 2010

Я пытаюсь реализовать связывание между некоторыми пользовательскими моделями и только начинаю баловаться со всей коллекцией mx.binding. *.Я попробовал этот простой, урезанный пример, но не могу правильно настроить привязку.Может кто-нибудь сказать мне, где я иду не так?

// Model
package  
{
 import flash.events.EventDispatcher;

 public class Model extends EventDispatcher
 {
  private var m_count:uint = 0;

  [Bindable]
  public function get Count():uint
  {
   return this.m_count;
  }

  public function set Count(c:uint):void
  {
   this.m_count = c;
  }
 }
}

И вот как выглядит приложение MXML

// MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:core="*" creationComplete="this.init();">
 <mx:Script>
  <![CDATA[
  import flash.events.Event;
  import flash.utils.describeType;
  import mx.binding.utils.ChangeWatcher;

  [Bindable]
  public var model:Model;

  public function init():void
  {
   var _this:Object = this;

   this.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
    _this.model.Count++;
   });


   this.model = new Model();

   trace(ChangeWatcher.canWatch(this.model, "Count")); // This always returns false for some reason
   trace(describeType(this.model));
  }

  public function UpdateText(s:String):void
  {
   trace(s);
  }
  ]]>
 </mx:Script>
 <mx:Text text="{this.model.Count}" creationComplete="trace(this);" />
</mx:WindowedApplication>

Обновление: я попробовал еще более голую версиюпоказано ниже.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="this.m_init();">
    <mx:Script>
        <![CDATA[
        import mx.binding.utils.ChangeWatcher;

        [Bindable] public var m:Object = new Object();

        public function m_init():void
        {
            trace(ChangeWatcher.canWatch(this, "m"));
        }
        ]]>
    </mx:Script>
    <mx:Text text="{this.m}" />
</mx:Application>

Все еще.Не имеет.Работа.ChangeWatcher.canWatch по-прежнему возвращает false, хотя в текстовом поле отображается [объект объекта].

Ответы [ 3 ]

0 голосов
/ 10 июля 2010

Я могу дать вам один пример changeWatcher, который может быть какой-то помощью, сейчас я работаю с этим, это полезно,

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Style source="../assets/css/scaleCSS.css"/>
<mx:Script>
 <![CDATA[
  import mx.binding.utils.ChangeWatcher;
  import mx.controls.Text;
  private var text:Text;

  [Bindable]private var ti1mc:int=50;

  private function init():void
  {
   ChangeWatcher.watch(ti1,'text',updateTextti);
   ChangeWatcher.watch(ti2,'text',updateTextti);
   ChangeWatcher.watch(ti3,'text',updateTextti);
   ChangeWatcher.watch(ti4,'text',updateTextti);
   ChangeWatcher.watch(ti5,'text',updateTextti);
  }

  private function updateTextti(event:Event):void
  {
   var str:String;
   str=event.currentTarget.id.slice(2,3);
//   trace("str : "+str);
//   trace(Canvas(textbox.getChildAt(int(TextInput(event.currentTarget).id.slice(2,3))-1)).id);
   Text(Canvas(textbox.getChildAt(int(TextInput(event.currentTarget).id.slice(2,3))-1)).getChildAt(0)).text=event.currentTarget.text;
//   trace(Text(Canvas(textbox.getChildAt(int(TextInput(event.currentTarget).id.slice(2,3))-1)).getChildAt(0)).id);
//   trace(event.currentTarget.id.slice(2,3));
    if(Canvas(textbox.getChildAt(int(TextInput(event.currentTarget).id.slice(2,3))-1)).width>=textbox.width)
    event.currentTarget.maxChars=event.currentTarget.length;
   else
    event.currentTarget.maxChars=50;
  } 
 ]]>
</mx:Script>
 <mx:Canvas width="80%" height="80%" horizontalCenter="0" verticalCenter="0" borderStyle="solid">
  <mx:VBox id="textbox" height="300" width="200" borderStyle="solid" top="50" left="100" horizontalScrollPolicy="off" verticalScrollPolicy="off">
   <mx:Canvas id="textcan1" borderStyle="solid" borderColor="#FF0000">
    <mx:Text id="text1" fontFamily="Arbeka" styleName="text" rotation="20"/>
   </mx:Canvas>
   <mx:Canvas id="textcan2" borderStyle="solid" borderColor="#FFFF00">
    <mx:Text id="text2" fontFamily="Arbeka" styleName="text" rotation="20"/>
   </mx:Canvas>
   <mx:Canvas id="textcan3" borderStyle="solid" borderColor="#00FF00">
    <mx:Text id="text3" fontFamily="Arbeka" styleName="text" rotation="20"/>
   </mx:Canvas>
   <mx:Canvas id="textcan4" borderStyle="solid" borderColor="#0000FF">
    <mx:Text id="text4" fontFamily="Arbeka" styleName="text" rotation="20"/>
   </mx:Canvas>
   <mx:Canvas id="textcan5" borderStyle="solid" borderColor="#00FFFF">
    <mx:Text id="text5" fontFamily="Arbeka" styleName="text" rotation="20"/>
   </mx:Canvas>
  </mx:VBox>
  <mx:VBox id="textinputbox" height="300" width="200" top="50" right="100" borderStyle="solid" verticalGap="0">
   <mx:TextInput id="ti1" width="100%" maxChars="50"/>
   <mx:TextInput id="ti2" width="100%" maxChars="50"/>
   <mx:TextInput id="ti3" width="100%" maxChars="50"/>
   <mx:TextInput id="ti4" width="100%" maxChars="50"/>
   <mx:TextInput id="ti5" width="100%" maxChars="50"/>
  </mx:VBox>  
 </mx:Canvas>
</mx:Application>

здесь отслеживается текстовое свойство ti1 (textinput), если в этом свойстве есть изменение, то вызывается функция обработчика (updatetextti)

надеюсь, это поможет

0 голосов
/ 11 июля 2010

Я удалил все файлы в папке obj под проектом, и проблема, похоже, ушла.Возможно, FlashDevelop использовал более старые скомпилированные двоичные файлы из этой папки, что приводило к тому, что выходные данные не синхронизировались с исходным кодом.

Свидетельство в поддержку этого заключается в двух вещах.Изменение SDK не повлияло на вывод на моем компьютере, что исключало какие-либо проблемы, связанные с SDK.Поэтому я создал новый проект в другой IDE на том же компьютере и скопировал в него код.На этот раз это сработало.Тогда я подумал, что это может быть кеш, и вошел и удалил его.

Оглядываясь назад, я должен был переименовать его, а позже попытаться снова скомпилировать старый кэш.Это было бы убедительным.

0 голосов
/ 09 июля 2010
  public function init():void
  {
    this.addEventListener(Event.ENTER_FRAME, increment);
    this.model = new Model();
  }
  public function increment(e:Event):void 
  {
    if(this.model)
      this.model.Count++;
  }

<mx:Text text="{model.Count}" creationComplete="trace(this);" /--> 
...