Flex ChangeWatcher不起作用

时间:2010-07-09 13:17:48

标签: flex binding adobe

我正在尝试在一些自定义构建的模型之间实现绑定,并开始涉足整个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,尽管textfield确实显示[object Object]。

3 个答案:

答案 0 :(得分:0)

  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);" /--> 

答案 1 :(得分:0)

我可以给你一个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)

希望这会有所帮助

答案 2 :(得分:0)

我删除了项目下obj文件夹中的所有文件,问题似乎消失了。可能是FlashDevelop使用了此文件夹中较旧的已编译二进制文件,这使得输出与源代码不同步。

支持这一点的证据有两个方面。更改SDK不会影响我自己的计算机上的输出,这排除了任何特定于SDK的问题。因此,我在同一台计算机上的另一个IDE中创建了一个新项目,并将代码复制粘贴到该项目中。这次它奏效了。就在那时我认为它可能是缓存并进入并删除它。

事后看来,我应该重命名它,然后再次尝试使用旧缓存进行编译。那将是决定性的。