【问题标题】:Flex ChangeWatcher doesn't workFlex ChangeWatcher 不起作用
【发布时间】:2010-07-09 13:17:47
【问题描述】:

我正在尝试在一些定制模型之间实现绑定,并且刚刚开始涉足整个 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>

还是。没有。工作。尽管文本字段显示 [object Object],但 ChangeWatcher.canWatch 仍然返回 false。

【问题讨论】:

  • 您的示例适用于我的 Flex 3 SDK。 canWatch 返回 true 并且绑定有效,我得到一个不断计数的文本字段。
  • 这让我怀疑我的配置是否有问题。你能给我一些指点吗?
  • 您使用的是 Flex 3 还是 Flex 4 SDK?
  • Flex 3.5.0,内部版本 12683。这是来自 AIR 2 SDK 的 beta 2。我现在正在下载 Flex 3 SDK 的最终版本并再次尝试。
  • 更新:使用新的 SDK 仍然返回 false。

标签: apache-flex binding adobe


【解决方案1】:
  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);" /--> 

【讨论】:

  • 我应该更具体。在 Main.mxml 的第 19 行,我正在检查是否可以使用 ChangeWatcher.canWatch 监视 Count 属性。这总是返回 false,即使下一行中的 describeType 调用显示 Count 作为公共访问器。
  • @Pranav 在第一个示例中,Text 的值是否正在更新?
  • 这很有趣。文本字段 ( ) 使用新值更新。但是我无法使用 ChangeWatcher.watch() 将模型中的值绑定到 UpdateText。返回的 CW 对象的 isWatching() 方法始终为 false。
【解决方案2】:

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

希望对你有帮助

【讨论】:

  • 对不起,我刚刚复制了我的代码,请从这里获取有用的东西
  • 感谢 Ankur。但我发现这不是语法问题。检查 Sam 回复的评论中的更新。
  • k,亲爱的,我实际上并没有阅读 n e 答案,如果我发现有人卡在 changwatcher,我想帮助那个人,是 bhai 我和 ma frnd,嗯 bh 2-3 changewatcher sunke pareshaan rahe the, bad mein changewatcher 很容易就出来了...
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2011-06-28
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多